在Python中转义shell命令的字符串

时间:2013-08-08 01:22:32

标签: python shell escaping

我有兴趣在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 个答案:

答案 0 :(得分:8)

在Python 3.3中,您可以使用shlex.quote返回字符串的shell转义版本。它是pipes.quote的继承者,自Python 1.6以来就被弃用了。请注意,文档建议使用此,以便您无法使用列表,如另一个答案所示。另外根据文档,引用与UNIX shell兼容。我无法保证它适用于您的情况,但使用rm进行快速测试,因为我没有Python 3.3:

pipes

答案 1 :(得分:4)

正确地完成这意味着不必担心这一点。贝壳必须担心空间,引号和parens; Python没有。

proc = subprocess.Popen([..., "-DSOME_MACRO(a, b)=some expression", ...], ...)