2016-04-02 61 views
1

我知道以前有類似的問題,但它們似乎都已通過重新設計參數傳遞的方式(即使用列表等)得到解決。Python子流程:無法逃避報價

但是,我有一個問題,因爲我沒有這個選項。有一個特定的命令行程序(我使用的是Bash shell),我必須傳遞一個帶引號的字符串。它不能無引號,它不能有複製的參數,它只需要單引號或雙引號。

command -flag 'foo foo1' 

我不能使用command -flag foo foo1,我也可以使用command -flag foo -flag foo1。我相信這是對命令如何編程以接受輸入的疏忽,但我無法控制它。

我傳遞的參數如下:

self.commands = [ 
       self.path, 
       '-flag1', quoted_argument, 
       '-flag2', 'test', 
       ...etc... 
       ] 
process = subprocess.Popen(self.commands, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
results = process.communicate(input) 

哪裏quoted_argument是像 '富foo1 foo2的'。 我試過轉義單引號("\'foo foo1 foo2\'"),但沒有輸出。

我知道這被認爲是不好的做法,因爲它是不明確的解釋,但我沒有另一種選擇。有任何想法嗎?

+1

相反quoted_argument'的'你能告訴我們你實際投入的命令字符串?令人費解的是,你的例子是'command -flag'foo foo1'',但'self.commands'具有不同的標誌。但是......只是做'quoted_argument =「foo foo1」'(即完全刪除引號)應該可以工作。 – tdelaney

+0

另外,只需使用shell'Popen(「command -flag'foo foo1'」,shell = True)''。 – tdelaney

+0

我試圖用命令來概括,實際的命令有點不同。我實際上得到一個列表並將它連接到引用的參數中,所以顯示有點複雜。如果我不需要,我也不希望連接shell = True的字符串。我會嘗試刪除引號。 –

回答

2

shell將命令字符串分解爲列表。引號告訴shell將多個單詞放入單個列表項中。由於您自己在創建列表,因此將單詞添加爲不帶引號的單個項目。

這兩個Popen命令是等效

Popen("command -flag 'foo foo1'", shell=True) 
Popen(["command", "-flag", "foo foo1"]) 
+0

注意:第一個'Popen()'調用運行一箇中間shell進程。第二個*在啓動'command'之前不運行shell *。 – jfs