2016-03-03 37 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