用subprocess.Popen调用python脚本并刷新数据

好的,所以我见过这么多的线索,但没有一个给出了完整的答案,我试过的所有东西都不适合我。

1)不断输出一些数据并刷新它的脚本:

import time
import sys

if __name__ == '__main__':
    for i in range(5):
        print i,
        sys.stdout.flush()
        time.sleep(1)

2)用Popen调用第一个脚本的脚本,应该逐个打印数字,但由于某种原因不打印,并且一次打印出来:

import sys
import subprocess

if __name__ == '__main__':
    process = subprocess.Popen(['python', 'flush.py'], stdout = subprocess.PIPE )
    for line in iter(process.stdout.readline, ''):
        print line,
        sys.stdout.flush()

首先我有点困惑是在第一个脚本是,如果你删除刷新它返回输出在一行所有O_O ...我非常确定这是因为time.sleep,但仍然有点期待它返回像一个标准的输出不断返回值0,1,2,3,4但不是全部在一起,当然可以解决它,但只是很奇怪,至少对我来说......

主要问题:第二个脚本不是一个接一个地返回数字,而是一次返回所有输出.....我需要的是看到数字一个接一个地弹出......

我在某处读到它不会返回POFN等待关闭管道的EOF,这就是为什么它运行到最后.....

那么我该怎么做或接下来尝试? 提前致谢。


正如@Warren Weckesser的评论所说,你的问题与缓冲问题无关。

父进程中的.readline()将不会返回,直到它读取一个换行符或达到EOF。 您的子进程根本不打印任何换行符,因此您的父进程在子进程结束之前不会打印任何内容。

最小修正只是在print i,结束时在子脚本中删除逗号。

这也适用于:

#!/usr/bin/env python
import sys
from subprocess import Popen, PIPE

p = Popen([sys.executable or 'python',
           '-u', # unbuffer stdout (or make it line-buffered on Python 3)
           '-c',
           """
import time

for i in range(5):
    print(i) # <-- no comma i.e., each number is on its own line
    time.sleep(1)
"""], stdout=PIPE, bufsize=1)
for line in iter(p.stdout.readline, b''):
    print(int(line)**2)

例:

 $ python parent.py
 0
 1
 4
 9
 16

这些数字每秒都会打印出来,而不用等待子进程结束。

如果你不想改变子脚本,那么你应该使用readline()来停止空白而不是换行符,例如:

#!/usr/bin/env python
import sys
from subprocess import Popen, PIPE

p = Popen(['python2', 'child.py'], stdout=PIPE, bufsize=0)
for token in generate_tokens(p.stdout):
    print(int(token))

generate_tokens()产生空白分隔的标记:

def generate_tokens(pipe):
    buf = []
    while True:
        b = pipe.read(1) # read one byte
        if not b: # EOF
            pipe.close()
            if buf:
                yield b''.join(buf)
            return
        elif not b.isspace(): # grow token
            buf.append(b)
        elif buf: # full token read
            yield b''.join(buf)
            buf = []

它一旦由孩子打印,它也会打印整数。

链接地址: http://www.djcxy.com/p/68647.html

上一篇: Calling python script with subprocess.Popen and flushing the data

下一篇: C++ code migration: handling uninitialized pointers