2017-07-18 50 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

非常感謝! –