2017-07-18 54 views
1

我有Python应用程序与线这样的Ubuntu服务器16.04上运行:呼叫GetOptions

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 

但是,当我运行它从蟒子我只得到:

Started 

如果我删除

or die ("Error") 

部分,我将获得:

Started 
Vars: FIRST = SECOND = 

而且没有错误或任何东西。由于我对perl很陌生,我怀疑在调用GetOptions时会出现语法错误,但阅读文档和搜索相当一段时间并没有让我获得任何帮助。

回答

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

+0

非常感谢! –