从Python调用Stata批处理:将Stata控制台输出导入命令行

3

我有一个Python脚本,其中调用了多个Stata do文件:

from subprocess import call
Stata_exec = "D:/Stata 12 MP2/StataMP-64.exe"
dofile = "D:/Test.do" 
call( "\"{0}\" do /e \"{1}\"".format(Stata_exec, dofile), shell=True)

这是一个测试do文件:

/* Merge some big files */

clear *

// Create dataset A (8000 variables, 300 observations)
set obs 300
gen ID = _n
forval i = 1/8000 {
    gen variableA`i' = runiform()
}
tempfile dataA
save "`dataA'"

// Create dataset B (5000 variables, 300 observations)
clear 
set obs 300
gen ID = _n
forval i = 1/5000 {
    gen variableB`i' = runiform()
}

sort ID

// Attempt merge
merge 1:1 ID using `dataA'
exit, clear

我希望将do文件的进度实时传输到控制台,以便与其他Python输出集成。这是否可能?
1个回答

2

您可以使用log命令将Stata会话的副本输出到文件,或者使用file命令将特定消息(如“创建数据A”)写入文本文件。Python应该能够使用subprocess.call(["tail", "-F", logfilename])来显示这些文件。


谢谢你的回答。我曾考虑过记录日志,然后在完成 do 文件后在控制台中打开日志。问题是,我正在批量提交的 .do 文件需要很长时间才能完成,在此期间唯一的控制台输出是一个 Python 打印语句 print("Do file running...")。我的主要愿望是在控制台中有视觉证据表明 Stata 正在后台执行某些操作。 - Ben Southgate
您可以在 Stata 正在工作时定期“窥视”日志。无需等待到结束。 - dimitriy
这可能需要另一个问题,但我该如何查看在同一脚本中执行Python命令期间编写的Stata日志文件(使用Python脚本)? - Ben Southgate
1
我使用的是Windows系统,但它提示“tail”不是一个可识别的命令(很遗憾我没有像Unix那样方便的工作环境)。此外,我是否错误地认为subprocess.call(["tail", "-F", logfilename])只有在上面的call("\"{0}\" do /e \"{1}\"".format(Stata_exec, dofile), shell=True)完成后才会执行,从而达不到预期效果?虽然我对subprocess还不熟悉,所以可能完全错了。 - Ben Southgate
@DimitriyV.Masterov 如果你有空的话,能否请您扩展一下您的回答?谢谢。 - user8682794
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接