2014-01-10 75 views
0

要運行使用python我如何使用字符串變量在subprocess.check_output在python

我已經wriiten下面的代碼有在Linux上ARGS的命令:

import subprocess 

msg = 'this is commit' 
cmdtorun = 'hg commit -m "{}"'.format(msg) 

try: 
    subprocess.check_output(cmdtorun, shell=True) 
    print "commit done" 
except subprocess.CalledProcessError: 
    print "commit failed 

但是這是給我的錯誤。

+2

*但是這給了我錯誤* - 如果你願意分享那個錯誤是什麼......你可以自己運行命令 - 如果是的話 - 你在哪裏運行它 - 是在同一地點的Python程序的工作目錄等... –

+0

不使用'check_output()',除非你需要命令的輸出。 (''hg','commit','-m',msg],cwd = repo_dir)== 0 else「failed」)使用'subprocess.call()'而不是' – jfs

回答

2

很可能,您的問題完全是其他問題。檢查你實際得到的錯誤。我猜測你在錯誤的目錄中執行hg(通過cwd=關鍵字參數傳遞)。

此外,您的'"{}"'.format轉義不正確 - msg包含雙引號時失敗。您可以使用shlex.quote進行轉義,但這很容易出錯。讓子進程轉義要容易得多:

import subprocess 
msg = 'this is commit' 
try: 
    subprocess.check_output(['hg', 'commit', '-m', msg]) 
    print("commit done") 
except subprocess.CalledProcessError as cpe: 
    print("commit failed: %r" % cpe) 
+0

雖然我同意將其分解更簡單 - 我不確定*問題是格式化會導致字符串[...]中的錯誤,您將希望正確地轉義該... *爲真。他們正在使用的格式會導致'hg commit -m'這是提交''所以應該是一個有效的命令'shell = True' ... –

+0

@JonClements你是對的,我忽略了引號。更新了答案。 – phihag

+1

我猜這是工作目錄,並提供'cwd',因爲你現在建議是一個快速修復的好方法 - 但是我們不會知道,直到OP管道:) –