2014-03-31 40 views
2

我有一個字符串,其是應該由在命令行中執行的成幀命令蟒子報價之前發送反斜線

cmdToExecute =「TRAPTOOL -a STRING‘ABC’-o STRING‘XYZ’」

我在考慮將字符串包含應該從命令提示符觸發的整個命令。如果仔細查看字符串cmdToExecute,可以看到包含在單引號中的值爲XYZ的選項o。有一個原因需要在單引號中給出,我的工具TRAPTOOL將無法處理該命令。

我使用subprocess.Popen執行整個命令。在shell執行我的命令之前,我打印的內容

print "Cmd to be exectued: %r" % cmdToExecute 
myProcess = subprocess.Popen(cmdToExecute, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False) 
(stdOut, stdErr) = myProcess.communicate() 

上述命令的輸出, Cmd的要執行:TRAPTOOL -a STRING 「ABC」 -o \ 'XYZ \'。

你可以看到輸出顯示一個反斜槓自動添加,同時打印。實際上,字符串中不存在「\」,我使用正則表達式進行測試。但是,當腳本在我的盒子上運行時,TRAPTOOL會截斷接收服務器上字符串XYZ的部分。我手動複製粘貼打印輸出並嘗試發送它,我看到接收服務器上的相同錯誤。但是,當我刪除反斜線時,它發送陷阱時沒有任何截斷。

  1. 任何人都可以說,爲什麼出現這種情況?
  2. 有無論如何我們可以看到在subprocess.Popen中實際執行了哪個命令?
  3. 是否有任何其他方式我可以執行我的命令其他subprocess.Popen可以解決這個問題?
+1

如果您是從頭開始手動構建命令,那麼您可以從頭開始創建列表:'''ABC''應該是'\「ABC \'' – Pyrce

+0

''cmd = ['TRAPTOOL',' a','STRING','ABC','-o','STRING','XYZ']'。注意:引號內沒有引號。沒有解釋它們的解釋。 – jfs

+1

@Pyrce:或三重引號可以使用:'r「」「TRAPTOOL -a STRING」ABC「-o STRING'XYZ'」「」' – jfs

回答

2

嘗試使用shlex來分割你的命令字符串:

>>> import shlex 
>>> argv = shlex.split("TRAPTOOL -a STRING \"ABC\" -o STRING 'XYZ'") 
>>> myProcess = subprocess.Popen(argv, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False) 
>>> (stdOut, stdErr) = myProcess.communicate() 

Popen構造函數的第一個參數可以是一個參數列表中shell命令或字符串,但由於涉及的所有引號,參數列表可能更容易處理。 (見Python subprocess documentation

如果你想看到正在寫入的命令,你或許可以這樣做:

>>> argv = shlex.split("bash -x -c 'TRAPTOOL -a STRING \"ABC\" -o STRING \'XYZ\''") 

這使得bash-x選項的方式呼應的命令外殼。

4

您要求提供字符串的repr表示形式,而不是str表示形式。基本上,你需要在Python交互式解釋器中輸入什麼才能獲得相同的輸出?這就是%r顯示的內容。改變,要%s看到的價值,因爲它的實際存儲:

print "Cmd to be exectued: %s" % cmdToExecute 
+0

擊敗我吧 - +1 – Pyrce

+0

你說得對Kirk,%r %s幫助我理解真正的問題。我誤解了python用\發送命令。但是,按照Alex的評論,字面上幫助我解決了這個問題。 – ASANT

+0

然後你做了正確的事情,將他標記爲回答者!我很高興能夠提供幫助。 :-) –