在Python中为Shell命令转义字符串

9

我想在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"

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

2个回答

14

在Python 3.3中,您可以使用shlex.quote返回字符串的shell转义版本。它是pipes.quote的后继者,自Python 1.6以来已被弃用。请注意,文档建议在无法使用列表的情况下使用此方法,正如另一个答案中所建议的一样。根据文档,引号与UNIX shell兼容。我不能保证它适用于您的情况,但对于rm进行快速测试,因为我没有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
$

这太棒了!我不是每天都能学到关于Python的新知识 ;) - Chris Cogdon
另外,为了实现Python2/3兼容性:from six.moves import shlex_quote - Chris Cogdon

1
正确地执行意味着不必担心这个问题。命令行需要注意空格、引号和括号,但 Python 则不需要。
proc = subprocess.Popen([..., "-DSOME_MACRO(a, b)=some expression", ...], ...)

2
可能需要更多的解释,为什么你不必担心它。 - user2357112
1
这两种方法对于 shell 来说是相同的。 - Ignacio Vazquez-Abrams
2
@Ignacio Vazquez-Abrams,通过“编写shell脚本”,我指的是从Python生成一个shell脚本。(通常是生成要运行的命令) - ideasman42
那么你为什么要使用 subprocess - Ignacio Vazquez-Abrams
1
@Ignacio Vazquez-Abrams,我的问题中没有提到subprocess - ideasman42
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接