python调用perl,文件在read()之前不会由Popen创建

2024-10-03 11:15:17 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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


Tags: 文件代码脚本编辑readoutputverbose错误
2条回答

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

我在使用Java时遇到了a similar problem。在

你真的有下面的代码,对吗?在

if verbose:
    outputRead = output.stdout.read()
    print outputRead

问题很有可能是孩子在尝试写入STDOUT时被阻止。除非您通过读取管道中的数据来在管道中腾出一些空间,否则子进程将无法完成对STDOUT的写入并继续到它创建您所引用的文件的位置。在

如果要防止子级在不读取的情况下阻塞,请将其stdout重定向到nul(Windows)或/dev/null(其他地方)。这应该适用于除Windows以外的任何地方:

^{pr2}$

(请原谅任何语法错误。我根本不懂Python。)

相关问题 更多 >