编辑:哎哟!我不小心发布了与我的问题不匹配的代码。我在完成实验之前就开始写这篇文章,所以我从测试过程的中间点开始发布代码。我修改了这个问题,通过稍微修改代码来反映我真正想发布的内容。在
下面的Python代码与预期一样工作,但有一个问题:除非I If verbose==False,否则不会创建Perl脚本生成的文件。我为什么要打电话输出.stdout.read()以便底层Perl脚本成功创建文件?在
cmdStringList = ["perl","script.pl","arg1",...]
output = subprocess.Popen(cmdStringList,stdout=subprocess.PIPE)
if verbose:
print output.stdout.read()
直到我在一个冗长的环境中尝试了错误的Python,我才意识到我的脚本是错误的。我做了一些googlefu来试图理解Popen和子进程的行为,但是我还没有找到这种行为的原因。任何帮助都将不胜感激。在
您应该继续读取一个流,否则缓冲区可能已满,然后您的perl进程可能会被阻塞。它与特定语言无关,只与底层操作系统有关。在
我在使用Java时遇到了a similar problem。在
你真的有下面的代码,对吗?在
问题很有可能是孩子在尝试写入STDOUT时被阻止。除非您通过读取管道中的数据来在管道中腾出一些空间,否则子进程将无法完成对STDOUT的写入并继续到它创建您所引用的文件的位置。在
如果要防止子级在不读取的情况下阻塞,请将其stdout重定向到
^{pr2}$nul
(Windows)或/dev/null
(其他地方)。这应该适用于除Windows以外的任何地方:(请原谅任何语法错误。我根本不懂Python。)
相关问题 更多 >
编程相关推荐