我正嘗試使用子進程在Python中交互式地運行python。當我運行以下腳本時,它會掛在我從stderr讀取的內容上。在Python中以交互方式運行Python
import subprocess
p = subprocess.Popen('python', shell=True, stdout=subprocess.PIPE,
stderr=subprocess.PIPE, stdin=subprocess.PIPE,
bufsize=1, universal_newlines=True)
text = p.stderr.read(256)
p.stdin.write('exit()\n')
p.close()
但是,如果我做一個小小的改變,從構造函數中刪除stdin=subproces.PIPE
,它的工作原理,併成功得到text
從p.stderr
分配輸出,然後在p.stdin.write(..)與'NoneType' object has no attribute 'write'
這爲什麼會掛起?我試圖保持一個子過程可以讀取並隨意寫入。
我想這樣做單線程。我的'主'腳本打開python然後循環運行,從用戶輸入。如果用戶輸入'r',則從進程讀取,如果他們輸入'w'則寫入進程。
我搜索得越多,測試出的解決方案就越多,看起來好像不可能用python子流程輸入輸出流。如果我沒有傳入stdin = PIPE,我可以運行程序並閱讀stderr。我也嘗試爲每個文件指針使用不同的命名文件,但沒有成功。
還在爲這場戰鬥而戰。就像一個筆記一樣,如果任何人都熟悉這個Ruby世界,我想要做的事就是可以使用「ChildProcess」寶石。有一定有使用Python的方式
我建議使用'p.communicate()'而不是直接寫入標準輸入,而標準輸入很容易出現死鎖。但是,我看不出這將如何有用。 –
p.communicate()塊。我不會讓stdin調用,因爲它會阻止對stderr.read的調用,儘管輸出可用。 – bgura
python版本之間的工作方式有很多不同之處..或者至少以前是這樣。你運行的是什麼版本的python,你運行的是哪個進程? https://docs.python.org/2/library/subprocess.html#subprocess.Popen.communicate –