我正在使用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命令中保留这些引号和空格。
无关:'shlex'是不是很复杂。 [它可能很容易中断:'r'echo'\ $ x“'''](http://stackoverflow.com/questions/28468807/python-executing-a-shell-command#comment45287698_28468860)。在开发过程中,从现有示例命令行创建一个初始'args'列表是很有用的。 – jfs