我正在尝试运行以下小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个字符,则可以正常工作。超过此限制,子流程不再生成任何stdout
或stderr
。如果我分别将它们切换为sys.stdout
和sys.stderr
,则所有内容都会按预期再次运行。从命令行调用时,muscle
可执行文件会同时写入stdout
和stderr
。
任何建议可能是什么原因以及如何解决这个问题? - 最好不要更新Python,因为安装在服务器上我有限制访问。
答案 0 :(得分:3)
使用child.
communicate(someinput)
获取完整输出;请参阅文档中的“警告”框。如果你真的需要在写入stdout时以交互方式读取stdin,那么(至少在Windows上)你可能会对Python +管道运气不好。
答案 1 :(得分:3)
您的进程在完整的管道上被阻止,等待您从中读取;因为你正忙着写作,你有一个很好的小僵局。如果要同时读取和写入同一个子进程,则应使用基于select()
的事件循环,在输出可用时读取,并在输入管道中有更多数据空间时写入。