2016-03-03 50 views
0

我正在使用python的subprocess.call()執行bash命令。 我正在將用戶輸入作爲參數傳遞給我的命令,如下所示。使用子進程調用和shlex在bash命令中轉義引號

my_command = 'command -option1 {0} -option2 {1}'.format(arg1, arg2) 

這裏ARG1和ARG2是用戶輸入的,但問題是用戶輸入可以有報價和空間所以我想通過這樣的雙引號包圍參數。

my_command = 'command -option1 "{0}" -option2 "{1}"'.format(arg1, arg2) 

由於我無法控制用戶輸入,輸入可以包含雙引號或單引號。因此,我正在用以下轉義序列替換輸入。

arg1 = arg1.replace('"', '\"').replace("'", "\'") 
arg2 = arg2.replace('"', '\"').replace("'", "\'") 
my_command = 'command -option1 "{0}" -option2 "{1}"'.format(arg1, arg2) 

所有看起來不錯,但當我執行命令時,我得到以下錯誤。

subprocess.call(shlex.split(my_command)) 

File "/usr/lib/python2.6/shlex.py", line 279, in split return list(lex)

File "/usr/lib/python2.6/shlex.py", line 269, in next token = self.get_token()

File "/usr/lib/python2.6/shlex.py", line 96, in get_token raw = self.read_token() File "/usr/lib/python2.6/shlex.py", line 172, in read_token

raise ValueError, "No closing quotation"

ValueError: No closing quotation

我該如何處理呢?

編輯:我想在bash命令中保留這些引號和空格。

+0

無關:'shlex'是不是很複雜。 [它可能很容易中斷:'r'echo'\ $ x「'''](http://stackoverflow.com/questions/28468807/python-executing-a-shell-command#comment45287698_28468860)。在開發過程中,從現有示例命令行創建一個初始'args'列表是很有用的。 – jfs

回答

1

不要用引號,空格等處理只需使用一個列表:

my_command = ["command", "-option1", arg1, "-option2", arg2] 
subprocess.call(my_command) 
+0

這種方法不會工作,因爲輸入可以有空格,分割將基於空格。 –

+0

我的解決方案不使用'split'。 – zondo

0

由於\"簡直等於",因此您不會在當前代碼中轉義引號。您應該使用雙逃逸逃避反斜槓(\)性格:

arg1 = arg1.replace('"', '\\"').replace("'", "\\'") 
arg2 = arg2.replace('"', '\\"').replace("'", "\\'") 
+0

謝謝Sekcuk 但問題是我想保留這些引號和空格。 –

+0

@AshokKumar這就是爲什麼你應該使用我建議的方法逃避它們。 – Selcuk