【问题标题】:get real time output from Popen从 Popen 获取实时输出
【发布时间】:2011-12-13 20:25:48
【问题描述】:
# cmd = "python subscript.py"
cmd = "ping localhost -n 10"
ofile =open("C:\file.log","w")
sp = subprocess.Popen(cmd,bufsize = 1, stdout = subprocess.PIPE, stderr = subprocess.PIPE)

while True:
    sp.poll()
    line = sp.stdout.readline()
    #eline = sp.stderr.readline()
    if line:
        print line
        ofile.write(line)
    #if eline:
        # print eline
        # ofile.write(" ERROR: "+line)
    # if (line == "" and eline == ""):
    if (line == ""):
        break

我正在尝试从子进程获取输出并使用上面的代码将其保存到日志文件中。它适用于ping localhost -n 10。但是当用它调用subscript.py时,我无法实时得到subscript.py的输出。我将在subscript.py 终止后获得所有输出。有什么建议吗?此外,我必须注释掉 eline = sp.stderr.readline() 才能使其正常工作。知道为什么某些代码不会给我subscript.py 的实时输出吗?

下标.py:

import time
i=0
while (i<5):
    time.sleep(1)
    i += 1
    print "ouput:",i

正如 rubik 提到的,之前有人问过几个类似的问题。我尝试了所有我发现的东西,但没有一个能解决我的问题。希望有人能指出调用subscript.py时它不起作用的原因。

编辑: 这里的问题: subscript.py 的输出直到自身终止才被刷新。 subscript.py 也没有任何标准错误,因此调用 sp.stderr.readline() 会导致无限等待。 解决方案: 在 subscript.py 中刷新输出 对于所有标准错误,我只使用标准错误 = subprocess.STDOUT 重定向到标准输出。

【问题讨论】:

标签: python subprocess popen


【解决方案1】:

您是否尝试在print 语句之后在您的子进程中调用sys.stdout.flush()?您可能会遇到输出缓冲。

【讨论】:

  • 是的,我已经绑定了那个,但是不行。无论出于何种原因,所有输出都将在 subscript.py 终止后显示
  • 误会你了。尝试在 subscript.py 中的 print 语句之后调用 sys.stdout.flush() 并且它有效。
猜你喜欢
  • 2015-09-21
  • 2013-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多