2011-03-24 67 views
2

我試圖運行下面的小Python腳本:Python 2.5的subprocess.Popen問題

#!/usr/local/bin/python2.5 
import sys, subprocess 
child = subprocess.Popen("muscle -stable -FASTA", 
         stdin=sys.stdin, 
         stdout=subprocess.PIPE, 
         stderr=subprocess.PIPE, 
         shell=(sys.platform!="win32")) 
print child.stderr.read() 
print child.stdout.read() 

如果stdin不超過約3750個字符,工作正常。超過此限制,子流程不再生產任何stdoutstderr。如果我分別將它們切換爲sys.stdoutsys.stderr,則所有事情均按預期工作。當從命令行調用時,muscle可執行文件同時寫入stdoutstderr

任何建議可能是什麼原因以及如何解決這個問題? - 最好不要更新Python,因爲安裝位於我有限訪問的服務器上。

回答

3

使用child.communicate(someinput)得到完整的輸出;請參閱文檔中的'警告'框。如果你真的需要在寫stdout的時候交互地閱讀stdin,那麼(至少在Windows上)你可能不太會用Python +管道。

+0

謝謝,「out,err = child.communicate()」完美地工作。但爲什麼我不明白。由於geekosaur解釋的原因? – 2011-03-24 23:00:07

+1

@user:'communic'觸發兩個線程,它們同時讀取'stdout'和'stderr'。 http://svn.python.org/view/python/trunk/Lib/subprocess.py?revision=82075&view=markup – 2011-03-24 23:03:13

+0

現在我看到鏈接並閱讀它,是的:-) – 2011-03-24 23:05:19

3

您的進程在完整管道上被阻塞,等待您讀取;因爲你正在忙着寫作,所以你有一個很好的小僵局。如果要同時讀取和寫入同一個子進程,則應使用基於select()的事件循環,在輸出可用時進行讀取,並在輸入管道中有更多數據存在空間時進行寫入。

+1

一個事件循環似乎對我正在嘗試做的事情有點矯枉過正。溝通()解決了它,但是無論如何,謝謝。 – 2011-03-24 23:01:15