在脚本中,我想使用一些命令行参数运行.exe作为“-a”,然后
将程序的标准输出重定向到文件?
我该如何实现?
答案 0 :(得分:26)
您可以使用子流程直接重定向到文件。
import subprocess
with open('output.txt', 'w') as output_f:
p = subprocess.Popen('Text/to/execute with-arg',
stdout=output_f,
stderr=output_f)
答案 1 :(得分:9)
最简单的是os.system("the.exe -a >thefile.txt")
,但还有很多其他方法,例如标准库中的subprocess
模块。
答案 2 :(得分:3)
你可以这样做 例如读取ls -l(或任何其他命令)的输出
p = subprocess.Popen(["ls","-l"],stdout=subprocess.PIPE)
print p.stdout.read() # or put it in a file
你可以为stderr / stdin做类似的事情
但正如亚历克斯提到的,如果你只是想在一个文件中,只需将cmd输出重定向到一个文件
答案 3 :(得分:0)
如果您只想运行可执行文件并等待结果,Anurag的解决方案可能是最好的。我需要在它到达时响应每一行输出,并发现以下工作:
1)使用write(text)方法创建对象。将stdout重定向到它(sys.stdout = obj)。在您的write方法中,在输出到达时处理输出。
2)在单独的线程中运行一个方法,类似于以下代码:
p = subprocess.Popen('Text/to/execute with-arg', stdout=subprocess.PIPE,
stderr=subprocess.PIPE, shell=False)
while p.poll() is None:
print p.stdout.readline().strip()
因为您已重定向stdout,PIPE会逐行将输出发送到您的写入方法。如果你不确定你是否会得到换行符,那么读(金额)也是有效的,我相信。
3)记得将stdout重定向回默认值:sys.stdout = __sys.stdout__
答案 4 :(得分:0)
虽然标题(.exe)听起来像是Windows上的问题。 我不得不分享接受的答案(带有stdout / stderr参数的subprocess.Popen())在Mac OS X(10.8)上使用python 2.7不适用于我。
我不得不使用subprocess.check_output()(python 2.7及以上版本)来使其工作。例如:
import subprocess
cmd = 'ls -l'
out = subprocess.check_output(cmd, shell=True)
with open('my.log', 'w') as f:
f.writelines(out)
f.close()
请注意,此解决方案会在程序完成时写入所有累积的输出。 如果要在运行期间监视日志文件。你可能想尝试其他的东西。 就我个人而言,我只关心最终结果。