【问题标题】:How to call a python script from Perl?如何从 Perl 调用 python 脚本?
【发布时间】:2025-12-26 01:15:15
【问题描述】:

我需要使用 Perl 脚本中的少量参数调用“/usr/bin/pdf2txt.py”。我该怎么做?

【问题讨论】:

    标签: python perl


    【解决方案1】:

    如果您需要捕获STDOUT

    my $ret = `/usr/bin/pdf2txt.py arg1 arg2`;
    

    您可以轻松捕获 STDERR 并将其重定向到 STDOUT:

    my $ret = `/usr/bin/pdf2txt.py arg1 arg2 2>&1`;
    

    如果你需要捕捉退出状态,那么你可以使用:

    my $ret = system("/usr/bin/pdf2txt.py arg1 arg2");
    

    请记住,``system() 都会阻塞,直到程序完成执行。

    如果你不想等待,或者你需要同时捕获 STDOUT/STDERR 和退出状态,那么你应该使用IPC::Open3

    【讨论】:

    • 最好使用system '/usr/bin/pdf2txt.py', $arg1, $arg2,因为这样可以避免shell插值出现问题(和危险的错误)。
    • 您可以使用$? 使用反引号捕获STDOUT 和退出状态 例如:my $output = `/usr/bin/pdf2txt.py arg1 arg2 2>&1`; my $ret = $?;
    【解决方案2】:
    my $output = `/usr/bin/pdf2txt.py arg1 arg2`;
    

    【讨论】:

    • 确保脚本是可执行的 (chmod +x) 并且它具有正确的 hashbang(例如 #!/usr/bin/env python)。
    【解决方案3】:

    如果不需要脚本输出,但需要返回码,请使用system()

    ...
    my $bin = "/usr/bin/pdf2txt.py";
    my @args = qw(arg1 arg2 arg3);
    my $cmd = "$bin ".join(" ", @args);
    
    system ($cmd) == 0 or die "command was unable to run to completion:\n$cmd\n";
    

    【讨论】:

    • 不要加入@args。使用system $bin, @args; - 可以避免许多潜在的有害错误。
    【解决方案4】:

    如果您想“实时”查看输出,而不是脚本运行完毕后,请在 python 之后添加 -u。示例:

    my $ret = system("python -u pdf2txt.py arg1 arg2");

    【讨论】: