1

我有一个 python 脚本,它必须调用 perl 脚本才能从远程服务器获取数据。perl 脚本必须保留 perl,它是第三方,我在那里没有任何选择。我正在尝试删除以前的开发人员在代码周围卡住的所有过时和弃用的东西,所以我想用子进程调用替换 commands.getstatusoutput 调用,但不知何故我似乎无法得到它工作...

到目前为止,脚本是通过 commands.getstatusoutput(string) 调用的,其中 string 是对 perl 脚本的完整系统调用,如 '/usr/bin/perl /path/to/my/perl/script.pl < /路径/到/我的/输入'。

我创建了一个参数列表(args = ['/usr/bin/perl', '/path/to/my/perl/script.pl', '<', '/path/to/my/input'])我将它传递给 subprocess.call:

args = ['/usr/bin/perl', '/path/to/my/perl/script.pl', '<', '/path/to/my/input']
strOut = subprocess.call(args)
print strOut

不幸的是,这失败并出现错误:

port absent at /path/to/my/perl/script.pl line 9.

perl 脚本是:

#!/usr/bin/perl
use IO::Handle;
use strict;
use Socket;
my ($remote, $port, $iaddr, $paddr, $proto, $ligne);
$remote = shift || 'my.provider.com';
$port   = shift || 9000;
if ($port =~ /\D/) { $port = getservbyname ($port, 'tcp'); }
die "port absent" unless $port;

尽管在这里阅读了其他类似的线程(从 python 调用 perl 脚本如何从 python 调用 perl 脚本?如何在 Python 脚本中获取 Perl 脚本的结果?Python getstatusoutput 替换不返回完整输出等)和其他地方,我觉得我错过了一些明显的东西,但我不知道是什么。

有任何想法吗?

谢谢。

4

1 回答 1

2

重定向<是一个shell功能。如果你想使用它,你需要将一个字符串传递给subprocess.call并使用shell = True. 例如:

args = ['/usr/bin/perl', '/path/to/my/perl/script.pl', '<', '/path/to/my/input']
strOut = subprocess.call(' '.join(args), shell = True)

或者,您可以执行以下操作:

args = ['/usr/bin/perl', '/path/to/my/perl/script.pl']
with open('path/to/my/input') as input_file:
    strOut = subprocess.call(args, stdin = input_file) 

最后,strOut将保存您的 perl 程序的返回码——这似乎是一个有趣的名字。如果你想从你的 perl 程序中获取输出流(stdout),你可能想和 andsubprocess.Popen一起使用。stdout=subprocess.PIPEcommunicate

于 2012-09-19T13:52:00.567 回答