编辑:哎呀!我不小心发布了与我的问题不符的代码。在我完成实验之前,我开始写这篇文章,所以我在测试过程中从中间点发布了代码。我已经修改了这个问题,通过稍微改变代码来反映我真正想要发布的内容。
以下Python代码按预期工作,但有一个问题:除非I If verbose == False,否则不会创建Perl脚本生成的文件。为什么我必须为底层Perl脚本调用output.stdout.read()才能成功创建文件?
cmdStringList = ["perl","script.pl","arg1",...]
output = subprocess.Popen(cmdStringList,stdout=subprocess.PIPE)
if verbose:
print output.stdout.read()
在我尝试在生产环境中使用verbose = False执行我的Python脚本之前,我甚至没有意识到任何错误。我做了一些google-fu试图理解Popen和子进程的行为,但我没有想出这种行为的原因。任何帮助将不胜感激。
答案 0 :(得分:1)
你实际上有以下代码,对吗?
if verbose:
outputRead = output.stdout.read()
print outputRead
问题很可能是孩子被阻止尝试写STDOUT。直到你通过读取管道中的一些空间,孩子将无法完成写入STDOUT并继续到它创建你所引用的文件的位置。
如果您想在不阅读的情况下阻止儿童阻止,请将其标准输出重定向到nul
(Windows)或/dev/null
(其他地方)。这应该适用于除Windows之外的所有地方:
cmdStringList = ["sh","-c","\"$0\"" \"$@\" >/dev/null","perl","script.pl","arg1",...]
(原谅任何语法错误。我根本不懂Python。)
答案 1 :(得分:1)
您应该继续阅读流,否则缓冲区可能会变满,那么您的perl进程可能会被阻止。它与特定语言无关,而与底层操作系统无关。
我使用Java时遇到a similar problem。