我有一个脚本parent.py
试图从Python中的子进程sub.py
读取标准输出。从刷新和未刷新缓冲区读取
父parent.py
:
#!/usr/bin/python
import subprocess
p = subprocess.Popen("sub.py", stdout=subprocess.PIPE)
print p.stdout.read(1)
而且子,sub.py
:
#!/usr/bin/python
print raw_input("hello world!")
我希望运行parent.py
从中打印的 'H' “世界,你好!”。其实,它挂起。我只能通过将-u
添加到sub.py
的she-bang line来获得预期的行为。
这让我感到困惑,因为当sub.py
直接从shell运行时,-u
开关没有任何区别; shell不知何故知道未刷新的输出流,与parent.py
不同。
我的目标是运行一个C程序作为子进程,所以我将无法控制是否刷新标准输出。它是如何比Python运行subprocess.Popen
同样的东西更好地访问进程的stdout?我能否从C程序中读取不刷新缓冲区的stdout流?
编辑:
这里是基于korylprince的评论更新的例子...
## capitalize.sh ##
#!/bin/sh
while [ 1 ]; do
read s
echo $s | tr '[:lower:]' '[:upper:]'
done
########################################
## parent.py ##
#!/usr/bin/python
from subprocess import Popen, PIPE
# cmd = [ 'capitalize.sh' ] # This would work
cmd = [ 'script', '-q', '-f', '-c', 'capitalize.sh', '/dev/null']
p = Popen(cmd, stdin=PIPE)
p.stdin.write("some string\n")
p.wait()
当通过script
跑,我得换行的稳定印刷(如果这是一个Python,子进程,它会引发EOFerror)。
我以前处理了这个问题。并非所有的C程序都可以使用。有一个称为脚本的令人敬畏的unix命令,可以让你的工作尽管如此。看到我的问题类似地使用它:http://stackoverflow.com/questions/11131825/main-python-process-is-stopped-using-subprocess-calls-in-socketserver – korylprince
它不与我的'c_prog'一起工作。如果我将它的标准输出到一个文件,然后键盘中断,文件将是空的。但是,如果我让它自然终止,输出使它到文件..我怀疑这是相关的。 – ajwood
@korylprince:当我通过'script'使用PIPE运行std和stdout子进程时,子进程似乎失败并带有EOFError。 – ajwood