我正在尝试使用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_)
因此,我的问题是如何运行外部应用程序,同时在控制台和文件中写入?
答案 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()