2016-09-28 120 views
1

我正嘗試使用子進程在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,它的工作原理,併成功得到textp.stderr分配輸出,然後在p.stdin.write(..)與'NoneType' object has no attribute 'write'

失敗

這爲什麼會掛起?我試圖保持一個子過程可以讀取並隨意寫入。

我想這樣做單線程。我的'主'腳本打開python然後循環運行,從用戶輸入。如果用戶輸入'r',則從進程讀取,如果他們輸入'w'則寫入進程。

我搜索得越多,測試出的解決方案就越多,看起來好像不可能用python子流程輸入輸出流。如果我沒有傳入stdin = PIPE,我可以運行程序並閱讀stderr。我也嘗試爲每個文件指針使用不同的命名文件,但沒有成功。

還在爲這場戰鬥而戰。就像一個筆記一樣,如果任何人都熟悉這個Ruby世界,我想要做的事就是可以使用「ChildProcess」寶石。有一定有使用Python的方式

+0

我建議使用'p.communicate()'而不是直接寫入標準輸入,而標準輸入很容易出現死鎖。但是,我看不出這將如何有用。 –

+0

p.communicate()塊。我不會讓stdin調用,因爲它會阻止對stderr.read的調用,儘管輸出可用。 – bgura

+0

python版本之間的工作方式有很多不同之處..或者至少以前是這樣。你運行的是什麼版本的python,你運行的是哪個進程? https://docs.python.org/2/library/subprocess.html#subprocess.Popen.communicate –

回答

0

爲「斯文Marnach」說,

Python不打印版權聲明如果標準輸入連接 到管道

的子說由於沒有可供閱讀的內容,因此被封鎖。通過輪詢輸出來解決這個問題。