如何从Python脚本运行Perl程序,同时接收日志并避免脚本返回码崩溃:-9

问题描述 投票:1回答:2

我正在使用Python使用不同的输入运行较长的(4-60分钟的运行时间)Perl程序。Perl程序较旧,并且使用警告已注释掉。不同的输入使用代码的不同部分。

# use warnings FATAL => 'all';

当我从bash运行CMD时,所有输入都起作用!

perl -I/storage my_script_entance.pl --ex_config R....

某些输入在我使用Popen运行时崩溃:

 run_script('perl -I/storage my_script_entance.pl --ex_config R....')


 def run_script(cmd):

    args = shlex.split(f'{cmd}')

    # p = sp.Popen(args, stdout=sp.PIPE, stderr=sp.PIPE)

    p = sp.Popen(args, stderr=sp.PIPE)

    output, err = p.communicate()
    print(f'output: {output}')
    print(f'err: {err}')

    rc = p.returncode

    print(f"script return code: {rc}")

崩溃看起来像这样:

output: None
err: b''
script return code: -9

它们在代码中的许多不同地方都有表面

我的环境是:具有Alpine Docker容器的Kubernetes,具有:

  • perl5(修订版5版本30子版本1)
  • Python 3.8.2

为什么从Popen运行脚本与从bash运行脚本不同?有没有一种方法可以完全相同地运行它们。

我阅读了Popen文档,并尝试对此example使用带有check = False的运行功能。但无法读取输出错误管道。

我使用pexpect尝试了一些选项,但到目前为止失败了。

是否有一种方法可以像在bash中一样运行脚本,并仅打印标准输出和错误?

P.S

[我之所以使用Python启动Perl的原因在于高级的Kafka库(Perl Kafka库是片状且僵化的)] >>

我正在使用Python使用不同的输入运行较长的(4-60分钟的运行时间)Perl程序。 Perl程序较旧,并且使用警告已注释掉。不同的输入使用...

python-3.x bash docker perl alpine
2个回答
1
投票

这里是使用subprocess.run()并通过subprocess.run()运行Perl脚本的示例:


1
投票

好吧@ikegami给我的问题很复杂:

© www.soinside.com 2019 - 2024. All rights reserved.