2011-01-25 62 views
2

我遇到了子進程和打印引號的問題。python子進程調用bash腳本 - 也需要打印報價

我的Python腳本需要用戶輸入,將它篡改一下 - 我需要它以這種方式將結果發送到bash腳本。

myscript.sh 'var1 == a var2 == b; othervar == c' /path/to/other/files 

我掛斷的地方是單引號。 Python試圖將它們撕掉。

我把這個用於我的測試。

subprocess.Popen([myscript.sh 'var=11; ignore all' /path/to/files], shell=True, executable="/bin/bash") 

它返回無效語法指向第二個單引號。我也嘗試了上面沒有括號和外部使用單引號和內部雙引號等。

其他 - 似。

正如我上面說的'var == a var == b; othervar == c'是從python腳本(以字符串格式)派生的 - 我需要在子進程中調用它,像這樣。

subprocess.Popen([myscript.sh myvariables /path/to/files], shell=True, executable="/bin/bash") 

我只需要像第一個例子一樣把單引號放在myvariables的值周圍。

任何指針,我要去哪裏正確的方法?

謝謝。

+0

我想我們今天有這個錯誤。是什麼讓人們認爲這是遠程有效的語法?列表項目用逗號分隔。而一個空白的「foo」與字符串「foo」無關。 (另外:我不能罰你引用的例子,你介意給出一個行號?) – delnan 2011-01-25 20:17:37

回答

6

當殼=真傳遞給POPEN,你通過任何你想做的發送命令行。這意味着你的列表應該只有一個元素。因此,例如:

subprocess.Popen(['myscript.sh "var=11; ignore all" /path/to/files'], shell=True, executable="/bin/bash") 

或者,如果/路徑/到/文件是在你的Python環境變量:

subprocess.Popen(['myscript.sh "var=11; ignore all" %s' % path_to_files], shell=True, executable="/bin/bash") 

說了這麼多我強烈建議您不要使用shell的說法。原因是脆弱。你會得到做這樣的一個更可靠的方法:

subprocess.Popen(["/bin/bash", "myscript.sh", "var=11; ignore all", path_to_files]) 

注意,「VAR = 11;忽略所有」作爲一個參數傳送給腳本傳遞。如果這些是單獨的參數,請將它們分隔列表元素。

0

這是一個列表,這些都是它的字符串,所以他們需要報價:

["myscript.sh", "var=11; ignore all", "/path/to/files"] 

這應該工作。如果你的腳本真的不知何故依賴於報價,那就試試這個(我不知道如何子工程的詳情):

["myscript.sh", "'var=11; ignore all'", "/path/to/files"] 
+0

我相信`subprocess`負責在必要時添加引號 - 如果它根本就沒有通過shell(我認爲有一些方法可以調用程序並指定不需要將可執行文件名和參數粘合到一個大字符串被一些shell解析;)) – delnan 2011-01-25 20:25:16

+0

@delnan:是的,我認爲你是對的。更新。 – 2011-01-25 20:27:10

2

我還沒有檢查爲什麼這個工作,但它並且沒有需要shell = True。

subprocess.Popen(["/bin/bash", "myscript.sh", '""' + string_to_be_quoted + '""', path_to_files])