6

我有兴趣在 Python3.x 中转义一个字符串,例如:

SOME_MACRO(a, b)

进入...

SOME_MACRO\(a,\ b\)

...以便它可以作为定义传递给程序(在这种情况下不是 gcc),

例如,

some_program -DSOME_MACRO\(a,\ b\)="some expression"

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

我不介意编写一些简单的函数来执行此操作,但这似乎是 Python 会包含的那种东西。

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

-D"SOME_MACRO(a, b)"="some expression"

...它期望第一个字符是标识符。

4

2 回答 2

11

在 Python 3.3 中,您可以使用shlex.quote返回字符串的外壳转义版本。它是自 Python 1.6 起已弃用的pipe.quote的继承者。请注意,文档建议您在无法使用 list 的情况下使用此方法,如另一个答案中所建议的那样。同样根据文档,引用与 UNIX shell 兼容。我不能保证它适用于您的情况,但使用 , 进行快速测试rmpipes因为我没有 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
$
于 2013-08-08T02:54:29.523 回答
3

正确地做意味着不必担心这一点。shell 必须担心空格、引号和括号;Python 没有。

proc = subprocess.Popen([..., "-DSOME_MACRO(a, b)=some expression", ...], ...)
于 2013-08-08T01:35:08.507 回答