【问题标题】:Run a perl script from my python script, print the output and wait for it to finish从我的 python 脚本运行 perl 脚本,打印输出并等待它完成
【发布时间】:2014-12-09 14:31:14
【问题描述】:

我有一个 python 脚本需要运行 perl 脚本,等待它完成,然后继续。

由于这种情况只会发生在 windows 机器上,我想我可以简单地打开一个新的 cmd 并在那里运行 perl 脚本,但我在这样做时遇到了困难。

import os

os.system("start /wait cmd /c {timeout 10}")

应该打开一个新的 cmd 并休眠 10 秒,但它会立即关闭。我不想将 perl 脚本放在timeout 10 的位置,因为它非常耗费资源。 另一个想法是使用subprocesscallPopenwait

perl_script = subprocess.call(['script.pl', params])

但我不确定在这种情况下 perl 脚本的标准输出会发生什么。

我知道perl脚本的位置和参数。

如何从我的 python 脚本运行 perl 脚本,打印输出(很多)并等待它完成?

编辑:

按照@rchang 的建议,我添加了subprocesscommunicate,如下所示,它按预期工作。

import subprocess, sys

perl = "C:\\perl\\bin\\perl.exe"
perl_script "C:\\scripts\\perl\\flamethrower.pl"
params = " --mount-doom-hot"

pl_script = subprocess.Popen([perl, perl_script, params], stdout=sys.stdout)
pl_script.communicate()

这些是我的第一行 perl,只是一个快速复制/过去的脚本来测试它。

print "Hello Perld!\n";
sleep 10;
print "Bye Perld!\n";

【问题讨论】:

    标签: python subprocess stdout


    【解决方案1】:
    import subprocess
    import sys
    
    perl_script = subprocess.Popen(["script.pl", params], stdout=sys.stdout)
    perl_script.communicate()
    

    这应该将子进程的标准输出连接到 Python 脚本的标准输出流,前提是您实际上不需要 Python 脚本在执行期间输出任何可能与子进程输出无关的有意义的内容。

    【讨论】:

    • python 脚本将等待 perl 脚本以communicate() 结束,对吗?在这种情况下,python 脚本不会产生任何输出,这将是所需的行为,非常感谢。
    • @DaedalusMythos 是的,communicate() 将等待完成。文档有点冗长(链接是 Python 2.7 文档):docs.python.org/2/library/…
    【解决方案2】:

    你可以试试:

    perl_script = subprocess.check_output(["script.pl", params])
    print perl_script
    

    【讨论】:

    • 感谢您的建议,但这会在完成后立即为我提供所有输出,对吗?我需要按预期输出,因为这会告诉我进度和可能的错误。
    猜你喜欢
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 2020-12-31
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    相关资源
    最近更新 更多