2011-11-22 18 views
5

मैं विंडोज पर किसी अन्य प्रोग्राम से एसएएस प्रोग्राम को कॉल करना चाहता हूं। मेरे पास बैच मोड में कमांड लाइन से एसएएस का आह्वान करने का कुछ अनुभव है, लेकिन इससे संदेश प्राप्त करने और उन संदेशों को संभालने का कोई वास्तविक अनुभव नहीं है। मैंने एसएएस कार्यक्रम के भीतर से स्टडीन से पढ़ने के बारे में काफी जानकारी प्राप्त की है, लेकिन मुझे लगता है कि मेरे एसएएस प्रोग्राम को stdout या stderr पर लिखने का तरीका नहीं पता लग रहा है। क्या मैं विंडोज़ में भी ऐसा कर सकता हूं? ,विंडोज में एसएएस से stdout और stderr कैप्चर करें?

  • पुनर्निर्देशन चेतावनी संदेश और त्रुटि संदेश उन्हें लॉग फ़ाइल
  • एसएएस कार्यक्रम के भीतर करने के लिए मुद्रण के बजाय stderr करने के लिए मैन्युअल रूप से त्रुटियों का पता:

    एसएएस कार्यक्रम से, मैं निम्नलिखित करना चाहते हैं और/या अन्य मुद्दों और उन्हें stderr या stdout करने के लिए आउटपुट। कर रहे हैं

    import subprocess 
    import os 
    
    
    if __name__ == '__main__': 
    
        filename = os.path.normpath(r'C:\Users\oob\Desktop\sas_python_test.sas') 
        sas_executable = os.path.normpath(r'C:\Program Files\SAS\SASFoundation\9.2\sas.exe') 
    
        cmd = r'"' + sas_executable + r'"' + " " + r'"' + filename + r'"' 
    
        p = subprocess.Popen(cmd,shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE) 
        print p.communicate() 
    

    इस से कंसोल पर मेरे परिणाम:

    एसएएस

    data test; 
        attrib i length=8; 
    
        do i = 1 to 10; 
         put 'putting'; *how can i make this go to stdout?; 
         putlog 'putting to log'; *this can go to the log - that is okay; 
         if i = 5 then do; 
          *pretend this is an error I am manually detecting - how can i make this go to stderr?; 
          put 'we found 5'; 
         end; 
         output; 
        end; 
    run; 
    
    data _null_; 
    
        1 = y; *this is an error detected by SAS. How can I make this go to stderr?; 
    
    run; 
    

    अजगर कि एसएएस कॉल:

यहाँ मैं क्या कोशिश की है है

('', '') 
+1

मैंने कभी एसएएस का उपयोग नहीं किया है, लेकिन क्या यह एक कंसोल ऐप है? हो सकता है कि यह stdout/stderr के लिए हैंडल नहीं हो सकता है। उस स्थिति में PyWin32 के 'win32com' मॉड्यूल को [OLE का उपयोग कर स्वचालित एसएएस] को आजमाएं [http://support.sas.com/documentation/cdl/en/hostwin/63285/HTML/default/viewer.htm#oleauto.htm)। – eryksun

+0

यहां अज्ञात पाइप का उपयोग करने के बारे में एसएएस दस्तावेज का एक लिंक है जो सहायक हो सकता है: http://support.sas.com/documentation/cdl/en/hostwin/63285/HTML/default/viewer.htm#unnamed.htm – RWill

उत्तर

2

जहां तक ​​मैं जानता हूँ कि यह सीधे प्राप्त करने के लिए संभव नहीं है। आप ssparm कमांड लाइन पैरामीटर का उपयोग करके सास में एक अद्वितीय फ़ाइल नाम में गुजरकर और अपने STDOUT आउटपुट को सहेजकर इसे अनुकरण कर सकते हैं। फिर आप एक अलग फ़ाइल में एसएएस लॉग भेजने के लिए -log कमांड लाइन पैरामीटर का उपयोग कर सकते हैं। एक बार एसएएस कार्यक्रम समाप्त हो जाने के बाद आप उत्पादित प्रत्येक फाइल को पार्स करने के लिए अपने पसंद के कार्यक्रम का उपयोग करने में सक्षम होंगे। दुर्भाग्यवश लॉग फ़ाइल लॉक हो जाती है जब तक कि सास प्रोग्राम इसके साथ खत्म नहीं हो जाता है, इसलिए यदि आप लॉगफाइल को संसाधित करने के लिए एसएएस का उपयोग करना चाहते हैं तो आपको ऐसा करने के लिए एक माध्यमिक अनुवर्ती प्रोग्राम लॉन्च करने की आवश्यकता होगी। (यानी आप इसे बनाने वाले एसएएस प्रोग्राम के भीतर से लॉग फ़ाइल नहीं पढ़ सकते हैं)।

एक बार जब आप लॉग इन पढ़ लेंगे तो आप ERROR से शुरू होने वाली लाइनों की तलाश कर सकते हैं: या चेतावनी: और उचित कार्यवाही करें (मेरे मामले में यह मुझे एक ईमेल भेजता है)। आप कुछ तर्क जोड़ना चाहते हैं जो कोडिंग की आपकी शैली के अनुरूप हैं। उदाहरण के लिए, कुछ चीजें जो एसएएस नोट्स के रूप में व्यवहार करती है, मैं त्रुटियों पर विचार करता हूं। इसके अलावा, कुछ चीजें एसएएस त्रुटियों के रूप में व्यवहार करती है, मुझे परवाह नहीं है। यहां तर्क का उपयोग किया गया है:

data problems log; 
    length line $1000; 

    infile "&logfile"; 
    input; 

    logfile = "&logfile"; 
    line_no = _n_; 
    line = _infile_; 
    problem = 0; 

    if 
    (
    line =: "ERROR:" 
    or line =: "WARNING:" 
    or line =: "NOTE: Numeric values have been converted to character values" 
    or line =: "NOTE: Character values have been converted to numeric values" 
    or line =: "NOTE: Missing values were generated as a result of performing an operation on missing values" 
    or line =: "NOTE: MERGE statement has more than one data set with repeats of BY values" 
    or line =: "NOTE: Invalid (or missing) arguments to the INTNX function have caused the function to return" 
    or line =: "INFO: Character variables have defaulted to a length of 200" 
    or line =: "NOTE: Invalid" 
) 
    and not 
    (
    line =: "WARNING: Your system is scheduled to expire" 
    or line =: "WARNING: The Base Product product with which Session Manager is associated" 
    or line =: "WARNING: will be expiring soon, and is currently in warning mode to indicate" 
    or line =: "WARNING: this upcoming expiration. Please run PROC SETINIT to obtain more" 
    or line =: "WARNING: information on your warning period." 
    or line =: "WARNING: This CREATE TABLE statement recursively references the target table. A consequence" 
    or line =: "WARNING: Unable to copy SASUSER registry to WORK registry. Because of this, you will not see registry customizations during this" 
    or line =: "WARNING: Estimates did not improve after a ridge was encountered in the objective function." 
    or line =: "WARNING: Estimates may not have converged." 
    or line =: "ERROR: A lock is not available for" 
    or line =: "ERROR: Errors printed on pages" 
) 
    then do; 
    problem = 1; 
    output problems; 
    end; 
    output log; 
run; 

आशा है कि इससे मदद मिलती है।

+0

बस एक विचार - सॉकेट का उपयोग करके आप एसएएस को एसटीडीओयूटी को भेजने का अनुकरण कर सकते हैं। पुराना एसएएस/इंट्रानेट मॉड्यूल भी इस उद्देश्य के लिए काम करेगा .... –

+0

धन्यवाद रॉब। मैंने sysparm और log का उपयोग किया है पहले बैच प्रोसेसिंग के लिए फ़ाइल तर्क, इसलिए मुझे लगता है कि मैं इस दृष्टिकोण के लिए जाऊंगा। लॉग फ़ाइल लॉक होने के बारे में बहुत बुरा है। मुझे उम्मीद है कि इनपुट डेटा पर पर्याप्त नियंत्रण होने के लिए मुझे कई त्रुटियों से बचने के लिए, शायद हो सकता है मैं जितना कर सकता हूं उतना पता लगा सकता हूं (उदाहरण के लिए अपेक्षाओं से अलग अवलोकनों की संख्या) और आउटपुट एसटीडीईआरआर के लिए आउटपुट। इसके अलावा, मैं सॉकेट में देखूंगा। – oob

2

मैं एसएएस काम की खिड़कियां संस्करण नहीं है, लेकिन यूनिक्स पर मैं इस तरह STDOUT पर पुन: निर्देशित:

data _null_; 
    file STDOUT; 
    do i=1 to 10; 
    put i=; 
    end; 
run; 

सुनिश्चित नहीं हैं कि STDERR को त्रुटि लॉग रीडायरेक्ट करने के लिए कैसे, लेकिन STDERR को मुद्रण इस प्रकार दिखाई देगा :

ods listing file=STDERR; 

proc print data=sashelp.class; 
run; 
+0

दिलचस्प । यह विंडोज पर काम नहीं करता है। मुझे लगता है कि एसएएस में सिर्फ स्टडआउट/स्टेडर हैंडल नहीं हैं :( – oob

+0

'ods लिस्टिंग फ़ाइल = STDERR;' यूनिक्स पर काम करें। थेंक्स –

-1

Googled आप के लिए STDERR करने के लिए लॉग पुनः निर्देशित:

proc printto log=STDERR; 
    run; 

    data _null_; 
     1=x; 
    run; 
+0

धन्यवाद मैंने यह कोशिश की है। यह लॉग को stderr पर रीडायरेक्ट नहीं करता है। यह एक लॉग फ़ाइल बनाता है 'stderr.log'। – oob

संबंधित मुद्दे