python调用perl,文件不是由Popen创建的,直到read()

时间:2013-02-07 00:23:41

标签: python perl subprocess popen

编辑:哎呀!我不小心发布了与我的问题不符的代码。在我完成实验之前,我开始写这篇文章,所以我在测试过程中从中间点发布了代码。我已经修改了这个问题,通过稍微改变代码来反映我真正想要发布的内容。

以下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和子进程的行为,但我没有想出这种行为的原因。任何帮助将不胜感激。

2 个答案:

答案 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