1

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

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

4

2 回答 2

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。)

于 2013-02-07T00:33:35.693 回答
1

您应该继续读取流,否则缓冲区可能会变满,然后您的 perl 进程可能会被阻塞。它与特定语言无关,而与底层操作系统无关。

我在使用 Java 时遇到了类似的问题。

于 2013-02-07T01:28:17.137 回答