Python 2.5 subprocess.Popen 问题

2 投票
2 回答
2248 浏览
提问于 2025-04-16 14:22

我正在尝试运行以下这个小的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.stdoutsys.stderr,一切又都正常运作了。这个muscle可执行文件在命令行中被调用时,会同时写入stdoutstderr

有没有什么建议可以找出原因并解决这个问题?最好是不要更新Python,因为这个安装在一个我访问权限有限的服务器上。

2 个回答

3

你的程序在一个满的管道上被阻塞了,它在等你去读取数据;而你却忙着写数据,这就造成了一个小死锁。如果你要同时对同一个子进程进行读取和写入,最好使用一个基于select()的事件循环,这样可以在有输出时读取数据,在输入管道有空间时再写入更多数据。

3

使用 child.communicate(someinput) 可以获取完整的输出;在文档中也可以看到一些“警告”提示。如果你真的需要在写入标准输出的同时,交互式地读取标准输入,那么(至少在Windows上)使用Python和管道可能会有点麻烦。

撰写回答