如何将.exe的输出重定向到python中的文件?

时间:2009-05-19 04:03:32

标签: python redirect io

在脚本中,我想使用一些命令行参数运行.exe作为“-a”,然后

将程序的标准输出重定向到文件?

我该如何实现?

5 个答案:

答案 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()

请注意,此解决方案会在程序完成时写入所有累积的输出。 如果要在运行期间监视日志文件。你可能想尝试其他的东西。 就我个人而言,我只关心最终结果。