如何从Perl调用Python脚本?

17
我需要从我的 Perl 脚本中使用少量参数调用 "/usr/bin/pdf2txt.py",我该如何做?
4个回答

23

如果您需要捕获 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


3
最好使用system '/usr/bin/pdf2txt.py', $arg1, $arg2,因为这样可以避免与Shell插值相关的问题(和危险的错误)。 - friedo
你可以使用反引号和 $? 来捕获 STDOUT 和退出状态。 例如: my $output = `/usr/bin/pdf2txt.py arg1 arg2 2>&1`; my $ret = $?; - Simon Pickup

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

4
确保脚本可执行(chmod +x),并且有适当的哈希标记(例如 #!/usr/bin/env python)。 - damg

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";

3
不要加入 @args。使用 system $bin, @args; - 这样可以避免许多潜在的有害漏洞。 - friedo

0

如果你想实时查看输出而不是等到脚本运行结束,可以在 python 后面加上-u。例如:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接