Pythonparent.py
のサブプロセスから stdout を読み取ろうとするスクリプトがあります。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」が出力されると予想されます。実際、ハングします。のshe-bang行に追加-u
することによってのみ、期待される動作を得ることができます。sub.py
これは私を混乱させます。シェルから直接実行する場合、-u
スイッチは違いがないからです。sub.py
とは異なり、シェルはフラッシュされていない出力ストリームに何らかの形で関与していますparent.py
。
私の目標は、サブプロセスとして C プログラムを実行することなので、stdout をフラッシュするかどうかを制御することはできません。から同じことを実行している Python よりも、シェルがプロセスの stdout にアクセスしやすいのはsubprocess.Popen
なぜですか? バッファをフラッシュしない 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 が発生します)。