我有一个脚本 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
来打印“hello world!”中的“h”。实际上,它挂了。我只能通过将 -u
添加到 sub.py
的 she-bang 行来获得预期的行为。
这让我感到困惑,因为当 sub.py
直接从 shell 运行时,-u
开关没有任何区别;与 parent.py
不同,shell 以某种方式知道未刷新的输出流。
我的目标是运行一个 C 程序作为子进程,所以我无法控制它是否刷新标准输出。与从 subprocess.Popen
运行相同内容的 Python 相比,shell 如何更好地访问进程的标准输出?我是否能够从不刷新其缓冲区的 C 程序中读取这样的标准输出流?
编辑:
这是一个基于 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)。
最佳答案
另一种选择是
p = subprocess.Popen(["python", "-u", "sub.py"], stdout=subprocess.PIPE)
或建议here .
我的经验是,是的,您无需任何额外努力就可以从大多数 C 程序中读取。
Python 解释器采取额外的步骤来缓冲其输出,这就是为什么它需要 -u
开关来禁用输出缓冲。您的典型 C 程序不会这样做。
除了 Python 解释器之外,我没有遇到任何程序(C 或其他),我希望它能工作但不在子 shell 中。
关于python - 从刷新与未刷新的缓冲区中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12632767/