Python 2.5 subprocess.Popen问题

时间:2011-03-24 22:47:57

标签: python subprocess

我正在尝试运行以下小Python脚本:

#!/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,因为安装在服务器上我有限制访问。

2 个答案:

答案 0 :(得分:3)

使用child. communicate(someinput)获取完整输出;请参阅文档中的“警告”框。如果你真的需要在写入stdout时以交互方式读取stdin,那么(至少在Windows上)你可能会对Python +管道运气不好。

答案 1 :(得分:3)

您的进程在完整的管道上被阻止,等待您从中读取;因为你正忙着写作,你有一个很好的小僵局。如果要同时读取和写入同一个子进程,则应使用基于select()的事件循环,在输出可用时读取,并在输入管道中有更多数据空间时写入。