【发布时间】:2013-05-09 14:28:59
【问题描述】:
我正在使用 python 脚本运行一个使用subprocess.Popen 的进程,同时将输出存储在一个文本文件中,并在控制台上打印它。这是我的代码:
result = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
for line in result.stdout.readlines(): #read and store result in log file
openfile.write("%s\n" %line)
print("%s" %line)
上面的代码工作正常,但它首先完成了过程并将输出存储在 result 变量中。之后 for 循环 存储输出并打印它。
但我希望在运行时输出(因为我的过程可能需要几个小时才能完成,所以这些小时我都没有得到任何输出)。
那么有没有其他函数可以动态地(在运行时)给我输出,这意味着只要进程给出第一行,它就应该被打印出来。
【问题讨论】:
-
我从未真正尝试过,但我认为您应该将自己的 Python
file对象发送到stdout(或stdin,或stderr)参数。然后你必须轮询那个文件。Subprocess的发明是为了让你免于痛苦,但看起来你别无选择。祝你好运。 -
“它首先完成该过程并将输出存储在结果中” - 这不是真的。
-
“它首先完成该过程并将输出存储在结果中” - 这不是真的。好吧,当我运行 Popen 命令时,它会一直运行直到进程完成,然后它会执行进一步的编码。如果它以其他方式起作用,我很想知道。
-
@AdrianRatnapala 听起来太复杂了,“别无选择”的说法是错误的。
-
您可以考虑使用 fcntl 将
result.stdout设置为非阻塞,这样可以实时读取,如果还没有数据,则会引发IOError
标签: python python-3.x subprocess