【发布时间】:2011-02-20 19:11:43
【问题描述】:
假设您有以下内容:
command = shlex.split("mcf -o -q -e -w %s %s" % (SOLFILE, NETFILE))
task = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = task.communicate()
print "stdout: %s" % stdout #debugging
print "stderr: %s" % stderr #debugging
if stderr:
sys.exit("MCF crashed on %s" % NETFILE)
没有必要知道 mcf 是什么,除非它是一个 C 程序,如果没有给定一个可满足的网络文件,它将溢出。 (为什么我不能确保所有的网络文件都是可满足的?嗯,因为最简单的检查方法是将它提供给 mcf 并查看它是否溢出......)
无论如何,当我在可执行脚本中运行它时,task.communicate() 似乎没有在 stdout 和 stderr 中存储任何内容。 (准确地说,我得到 stdout == stderr == ''。)相反,来自 mcf 的 stderr 流似乎“泄漏”到终端,而不是被子进程管道捕获。下面是一些示例输出来说明:
Netfile: facility3cat_nat5000_wholesaler_capacitation_test_.net
Solfile: facility3cat_nat5000_wholesaler_capacitation_test_.sol
*** buffer overflow detected ***: mcf terminated
======= Backtrace: =========
...
...[fifty lines of Linda Blair-esque output]...
...
stdout: None
stderr:
...[program continues, since stderr did not evaluate to True]...
这只会在从命令行运行脚本时失败。当我在解释器中逐行执行时,stdout 和 stderr 被正确分配:
>>> task = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
>>> stdout, stderr = task.communicate()
>>> stderr
'*** buffer overflow detected ***: mcf terminated\n======= Backtrace: =========\n'
...[more headspinning and vomit]...
谁能帮我理解为什么这在解释器中有效,但在执行时无效?提前致谢!
【问题讨论】:
-
修改了我的答案以表明我已经完成了测试。
标签: python subprocess