2015-11-19 26 views
2

我知道如何從Python啓動Stata。在這裏,我有小程序從Python運行Stata並確保沒有錯誤

def dostata(dofile, *params): 
    ## Launch a do-file, given the fullpath to the do-file 
    ## and a list of parameters.  
    cmd = ["C:\Program Files (x86)\Stata13\StataMP-64.exe", "do", dofile] 
    for param in params: 
     cmd.append(param) 
    a = subprocess.Popen(cmd, shell=True) 

path = "C:/My/do/file/dir/" 
filename = "try.do" 

dostata(path + filename, model, "1", "") 

這是工作,或多或少。但它並不能保證Stata程序能夠成功完成。我如何從Stata獲得一些反饋,說「完成成功」?

+0

我還沒有很好的Python編程,所以我不能肯定地說。如果不可行,我會建議將Stata輸出寫入純文本日誌文件,然後在Python中掃描該文檔以查找錯誤或返回代碼。你可以使用正則表達式來搜索r([0-9]);或類似的東西,以查找Stata輸出是否包含錯誤。 – ander2ed

回答

2

子過程使用returncode返回成功(零)或底層被叫流程的失敗(非零)的結果。

但是,Stata做的文件不是完全可執行文件,而是作爲batch jobs運行。由於這個原因,Stata.exe將始終返回一個成功代碼,因爲它始終運行,無論代碼輸出如何。因此,請考慮下面的Python讀取位置,並將Stata的日誌輸出到其控制檯以供用戶查看代碼結果。可能甚至要求Python掃描任何日誌文件Stata error code,​​- r(9999),並且如果在日誌文件中存在,則強制Python向其發送消息。

import os, subprocess 

# CURRENT DIRECTORY 
cd = os.path.dirname(os.path.abspath(__file__)) 

def openlog(filename): 
    with open(filename, 'r') as txt: 
     for line in txt: 
      print(line.strip()) 

def dostata(dofile, logfile, *params): 
    ## Launch a do-file, given the fullpath to the do-file 
    ## and a list of parameters.  
    cmd = ["C:\Program Files (x86)\Stata13\StataMP-64.exe", "/b", "do", dofile] 
    for param in params: 
     cmd.append(param) 
    a = subprocess.Popen(cmd, shell=True) 

    print('STATA OUTPUT:\n') 
    openlog(os.path.join(cd, logfile)) 


path = "C:/My/do/file/dir/" 
filename = "try.do" 
logname = "try.log" 

result = dostata(os.path.join(path, filename), logname, "") 
+0

問題是,如果在運行Stata文件時發生錯誤並在執行文件中出現錯誤,則Python仍會運行並等待響應,直到關閉Stata,並且不會生成錯誤,因爲應用程序Stata按預期完成。 –

+0

你測試過了嗎? Python應該完全按照Stata的控制檯顯示返回輸出,並且如果由於錯誤Stata結束執行,那麼這個Python子進程也是如此。當然如果你在這個子進程之後有其他的.py代碼,代碼將會繼續,除非你退出script:'sys.exit(1)'。 – Parfait

+0

我試了幾次。沒有捕獲到不存在的文件的Stata錯誤。 –