我在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的方式存在语法错误,但阅读文档和谷歌搜索相当一段时间并没有把我带到任何地方。
答案 0 :(得分:3)
Perl脚本中的GetOptions(...)
行指定了如何将输入提交到脚本:
script.pl --var1 s1 --var2 s2
您可以从命令行正确使用它。
但是,您的Python脚本将变量var1
和var2
中的值作为单个字符串传递。你需要拼出整个命令行
proc = subprocess.Popen(["sudo", \
"perl", "/path/script.pl", "--var1", str(var1), "--var2", str(var2) ], \
stdout=subprocess.PIPE)
此处var1
仅包含值,而不包含问题中的"--var1 "
字符串(var2
的字符串相同)。