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

Call GetOptions in perl script from Python subprocess

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

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 的方式存在语法错误,但是阅读文档和谷歌搜索了很长一段时间并没有让我找到任何地方。

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 相同)。