Python中shell命令的转义字符串

Python中shell命令的转义字符串,python,shell,escaping,Python,Shell,Escaping,我对Python3.x中的字符串进行转义感兴趣,例如: SOME_MACRO(a, b) 进入 SOME_MACRO\(a,\ b\) 。。。这样就可以将其作为define传递给程序(本例中不是gcc) 例如 我希望shlex会有这个功能,但我没有找到如何做到这一点,并且已经检查了许多类似的问题 我不介意编写一些简单的函数来实现这一点,但这似乎是Python应该包含的内容 注意:我将参数传递给的程序不会接受: 。。。它希望第一个字符是一个标识符。正确地使用它意味着不必担心这个问题。shell

我对Python3.x中的字符串进行转义感兴趣,例如:

SOME_MACRO(a, b)
进入

SOME_MACRO\(a,\ b\)
。。。这样就可以将其作为define传递给程序(本例中不是gcc)

例如

我希望
shlex
会有这个功能,但我没有找到如何做到这一点,并且已经检查了许多类似的问题

我不介意编写一些简单的函数来实现这一点,但这似乎是Python应该包含的内容

注意:我将参数传递给的程序不会接受:


。。。它希望第一个字符是一个标识符。

正确地使用它意味着不必担心这个问题。shell必须担心空格、引号和paren;Python没有

proc = subprocess.Popen([..., "-DSOME_MACRO(a, b)=some expression", ...], ...)
在Python3.3中,可以使用返回字符串的shell转义版本。它是的继承者,自Python 1.6以来就被弃用了。请注意,文档建议在无法使用列表的情况下使用此,如另一个答案所示。另外,根据文档,引用与UNIX shell兼容。我不能保证它适用于您的案例,但是使用
rm
,使用
pipes
进行快速测试,因为我没有Python 3.3:

$ touch \(a\ b\)
$ ls
(a b)

>>> import subprocess, pipes
>>> filename = pipes.quote("(a b)")
>>> command = 'rm {}'.format(filename)
>>> subprocess.Popen(command, shell=True)

$ ls
$

也许有必要再解释一下为什么不必担心它。您指出您并不总是需要转义字符串,这很好,我知道,但转义字符串仍然是一个有效的问题(IMHO),例如,您可能正在编写一个shell脚本,而不是直接运行命令。如果您正在编写一个shell脚本,那么这不是一个Python问题。这两种方法对shell都是一样的。@Ignacio Vazquez Abrams,“编写一个shell脚本”,我的意思是从Python生成一个shell脚本。(生成一般运行的命令)这太棒了!我不是每天都能学到Python的新知识;)另外,对于python2/3兼容性:
from six.moves import shlex_quote
proc = subprocess.Popen([..., "-DSOME_MACRO(a, b)=some expression", ...], ...)
$ touch \(a\ b\)
$ ls
(a b)

>>> import subprocess, pipes
>>> filename = pipes.quote("(a b)")
>>> command = 'rm {}'.format(filename)
>>> subprocess.Popen(command, shell=True)

$ ls
$