从Python运行Stata并确保没有错误

时间:2015-11-19 15:00:03

标签: 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到Python获得一些反馈意见"成功完成"?

1 个答案:

答案 0 :(得分:2)

子流程使用returncode返回基础被调用进程的成功(零)或失败(非零)结果。

但是,Stata do文件不是完全可执行文件,而是以batch jobs运行。因此,Stata.exe将始终返回成功代码,因为无论.do代码输出如何,它始终会运行。因此,请考虑下面Python读取的位置,并将Stata的日志输出到其控制台,以便用户查看代码结果。甚至可能会使Python扫描日志文件中的任何Stata error coder(1) - 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, "")