2014-12-02 44 views
0

我想用Popen來運行一個需要幾個參數的java程序,最後一個是xml模板。來自變量的Python Popen輸入?

我到目前爲止試圖通過溝通()傳遞模板的價值,但似乎並不奏效。

command = [ 
     'java', 
     '-jar', 
     '~/jenkins-cli.jar', 
     '-noKeyAuth', 
     '-s', 
     'docker-host', 
     'create-job', 
     (self.project.project_name+'-'+env) 
    ] 

subprocess.Popen(command, 
       stdin=subprocess.PIPE, 
       stdout=subprocess.PIPE, 
       stderr=subprocess.PIPE 
       ).communicate(input=template.render(template_vars)) 

我知道一個事實,即template.render(template_vars)的值是正確的,我可以使用從該函數調用的輸出在命令行上和它完美的作品,這個問題只在傳遞對過程的價值。

如果我從命令行運行以下所有功能。

java -jar ~/jenkins-cli.jar -noKeyAuth -s jenkins-host create-job test-dev < template.xml 

有沒有更好的方法將template.render(template_vars)的輸出作爲輸入發送到進程?

+0

「最後一個是xml模板」似乎不是真的;看起來XML模板是Java程序的stdin,而不是命令行參數。 – abarnert 2014-12-02 22:46:37

回答

2

我不認爲你的問題是這裏的輸入,而是參數。特別是:

'~/jenkins-cli.jar', 

在命令行上,您可以免費獲得shell波浪擴展。但使用subprocess(或調用exec - 家庭功能的任何語言,爲subprocess那樣)時,你必須做手工,像這樣:

os.path.expanduser('~/jenkins-cli.jar'), 

此外,你傳遞一個不同的價值,爲-s選項('docker-host'而不是'jenkins-host')以及項目名稱('something-env'而不是'test-dev'),因此命令行工作並不能真正表明您的代碼應該正常工作。作爲一個方面說明,如果你試圖調試你的代碼,忽略stdout,stderr和return代碼似乎很愚蠢。打印出來,看看你會得到什麼,就像這樣:

p = Popen(command, …) 
out, err = p.communicate(input=…) 
print(p.returncode, out, err) 

或者,當然,不捕獲在首位的stdoutstderr,所以他們只是打印到控制檯。

+0

這是〜爲我搞砸的東西,謝謝我完全錯過了我的使用it.The問題與我說jenkins主機與碼頭主機是我的一個錯字,在實際的代碼中它指定我的網址jenkins大師,我正在刪除,第二次它鍵入它,我只是搞砸了,鍵入碼頭,因爲我一直在使用它。謝謝您的幫助。 – 2014-12-03 14:37:09