从python调用perl脚本在commands.getstatusoutput中工作,但在subprocess.call中没有

时间:2012-09-19 13:49:52

标签: python perl command subprocess popen

我有一个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 / pel / script.pl','<','/ path / to / my /输入'])并将其传递给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;

尽管在这里阅读了其他类似的帖子(Call perl script from pythonHow to call a perl script from python?How can I get the results of a Perl script in Python script?Python getstatusoutput replacement not returning full output等)和其他地方,但我觉得我错过了一些明显但我可以找不到。

有什么想法吗?

感谢。

1 个答案:

答案 0 :(得分:2)

重定向< shell 功能。如果您想使用它,则需要将字符串传递给subprocess.call并使用shell = True。 e.g:

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),您可能希望将subprocess.Popenstdout=subprocess.PIPEcommunicate结合使用。