Python 2.5 subprocess.Popen 问题
我正在尝试运行以下这个小的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()
这个脚本在输入不超过大约3750个字符时运行得很好。但是一旦超过这个限制,子进程就不再产生任何输出,也就是没有stdout
(标准输出)或stderr
(标准错误输出)。如果我把它们换成sys.stdout
和sys.stderr
,一切又都正常运作了。这个muscle
可执行文件在命令行中被调用时,会同时写入stdout
和stderr
。
有没有什么建议可以找出原因并解决这个问题?最好是不要更新Python,因为这个安装在一个我访问权限有限的服务器上。
2 个回答
3
你的程序在一个满的管道上被阻塞了,它在等你去读取数据;而你却忙着写数据,这就造成了一个小死锁。如果你要同时对同一个子进程进行读取和写入,最好使用一个基于select()
的事件循环,这样可以在有输出时读取数据,在输入管道有空间时再写入更多数据。
3
使用 child.
communicate(someinput)
可以获取完整的输出;在文档中也可以看到一些“警告”提示。如果你真的需要在写入标准输出的同时,交互式地读取标准输入,那么(至少在Windows上)使用Python和管道可能会有点麻烦。