python Popen打印外部应用程序的输出并同时保存(记录)

时间:2018-04-05 15:09:09

标签: python subprocess

我正在尝试使用Popen运行外部应用程序并在控制台或分离的控制台中打印输出(更好),同时将输出保存到文件中。通过控制台没有用户交互, app.bat 只发送(写入)数据,并且应该在执行完成后自动终止。

运行以下命令只会导致在python控制台中打印结果。

p = subprocess.Popen("app.bat --x --y", shell=False)

如果我将stdout添加为文件,我可以将输出重定向到文件,但是没有任何内容写入控制台,这不会给用户任何反馈(并且反馈需要实时,而不是在执行后因为应用程序大约运行1-3分钟。

file_ = open("ouput.txt", "w+")
p = subprocess.Popen("app.bat --x --y", shell=False,stdout=file_)

因此,我的问题是如何运行外部应用程序,同时在控制台和文件中写入?

2 个答案:

答案 0 :(得分:0)

对于您想要做的事情,我建议您使用日志记录模块。 这里一个好的首发是https://docs.python.org/2/howto/logging-cookbook.html 它甚至几乎完全描述了你的用例。

答案 1 :(得分:0)

如果您要对Popen()电话的输出进行后处理,通常应将stdout重定向到PIPE,然后从那里读取输出。这将允许您例如写入文件和屏幕:

import subprocess

logfile ='output.txt'
command = ['app.bat', '--x', '--y']

p = subprocess.Popen(command, stdout=subprocess.PIPE, universal_newlines=True)

with open(logfile, 'w+') as f:
    for line in p.stdout:
        print(line.rstrip())
        f.write(line)

现在,这将阻止app.bat完成,这可能正是您想要的。但是,如果您希望Python脚本继续运行,并且在后台运行app.bat,则可以启动一个处理subprocess stdout的线程:

import subprocess
import threading

logfile ='output.txt'
command = ['app.bat', '--x', '--y']

def writer(p, logfile):
    with open(logfile, 'w+') as f:
        for line in p.stdout:
            print(line.rstrip())
            f.write(line)

p = subprocess.Popen(command, stdout=subprocess.PIPE, universal_newlines=True)

t = threading.Thread(target=writer, args=(p,logfile))
t.start()

# Other commands while app.bat runs

t.join()