我有一個腳本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