我有一个脚本parent.py
试图从sub.py
Python 的子进程中读取标准输出。
家长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
's she-bang 行来获得我的预期行为。
这让我感到困惑,因为当直接从 shell 运行-u
时,开关没有区别。sub.py
与parent.py
.
我的目标是将 C 程序作为子进程运行,因此我将无法控制它是否刷新标准输出。为什么 shell 比从 运行相同的东西的 Python 可以更好地访问进程的标准输出subprocess.Popen
?我是否能够从不刷新其缓冲区的 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)。