【问题标题】:Run Stata from Python and assure that there was no errors从 Python 运行 Stata 并确保没有错误
【发布时间】:2015-11-19 15:00:03
【问题描述】:

我知道如何从 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,说“已成功完成”?

【问题讨论】:

  • 我对 Python 编程还不是很好,所以我不能肯定。如果不可能,我建议将 Stata 输出写入纯文本日志文件,然后在 Python 中扫描该文档以查找错误或返回代码。您可以为此使用正则表达式并搜索 r([0-9]);或类似的东西,以查找 Stata 输出是否包含错误。

标签: python stata


【解决方案1】:

子进程使用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, "")

【讨论】:

  • 问题是如果在运行Stata do文件时发生错误并在do文件中出错,Python仍然运行并等待响应,直到关闭Stata,并且没有产生错误,因为应用程序Stata完成正如预期的那样。
  • 你测试过这个吗? Python 应该完全按照 Stata 的控制台显示返回输出,如果 Stata 由于错误而结束执行,这个 Python 子进程也将如此。当然,如果您在此子进程之后还有其他 .py 代码,除非您退出脚本,否则代码将继续运行:sys.exit(1).
  • 我试了几次。未捕获不存在文件的Stata错误。
  • 原来 Stata .do 文件并不完全是可执行文件,而是在命令行中作为批处理作业运行。我曾认为它可以与 Rscript.exe 互换来运行 R 脚本,就像我对 Python 所做的那样。但是使用/b 参数,您可以输出一个日志(与.do 文件同名,但在.py 脚本的当前目录中)并让Python 将其读入控制台。请参阅我的代码编辑和有关扫描日志文件以查找错误的选项的文本说明。
猜你喜欢
  • 2020-07-02
  • 2014-02-11
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-31
相关资源
最近更新 更多