从Python子进程调用perl脚本中的GetOptions

时间:2017-07-18 08:23:32

标签: python perl subprocess getopt-long

我在ubuntu服务器16.04上运行python应用程序,其行如下:

var1 = "--var1 " + var1
var2 = "--var2 " + var2
proc = subprocess.Popen(["sudo", "perl", "/path/script.pl", str(var1), str(var2) ], stdout=subprocess.PIPE)

Perl脚本包含以下行:

#!/usr/bin/perl
use File::Path;
use Getopt::Long;
use strict;
use warnings;

my $var1 = '';
my $var2 = '';

print "Started ";

GetOptions ("var1=s" => \$var1, "var2=s" => \$var2) or die ("Error");

print "Vars: FIRST = $var1 SECOND = $var2 ";
...

此应用程序由sudo组的成员运行,该组具有在没有密码的情况下运行任何sudo命令的权限。 当我从终端以该用户运行此命令时:

su that_user
sudo perl /path/script.pl --var1 XXX --var2 YYY

我得到了理想的输出:

Started 
Vars: FIRST = XXX SECOND = YYY

但是当我从python运行它作为子进程时我只得到:

Started 

如果我删除

or die ("Error")

部分,我会得到:

Started 
Vars: FIRST =  SECOND = 

没有任何错误或任何错误。因为我对perl很新,我怀疑我调用GetOptions的方式存在语法错误,但阅读文档和谷歌搜索相当一段时间并没有把我带到任何地方。

1 个答案:

答案 0 :(得分:3)

Perl脚本中的GetOptions(...)行指定了如何将输入提交到脚本:

script.pl --var1 s1 --var2 s2

您可以从命令行正确使用它。

但是,您的Python脚本将变量var1var2中的值作为单个字符串传递。你需要拼出整个命令行

proc = subprocess.Popen(["sudo", \
    "perl", "/path/script.pl", "--var1", str(var1), "--var2", str(var2) ], \
    stdout=subprocess.PIPE)

此处var1仅包含值,而不包含问题中的"--var1 "字符串(var2的字符串相同)。