用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