【问题标题】:escape a string for shell commands in Python [duplicate]在 Python 中转义 shell 命令的字符串 [重复]
【发布时间】:2013-08-09 14:26:19
【问题描述】:

我有兴趣在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"

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

【问题讨论】:

    标签: python shell escaping


    【解决方案1】:

    在 Python 3.3 中,您可以使用 shlex.quote 返回字符串的外壳转义版本。它是pipes.quote 的继承者,自 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
    $
    

    【讨论】:

    • 这太棒了!我不是每天都能学到关于 Python 的新东西 ;)
    • 另外,为了兼容python2/3:from six.moves import shlex_quote
    【解决方案2】:

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

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

    【讨论】:

    • 可能有必要再解释一下为什么您不必担心它。
    • 您指出您并不总是需要转义字符串,这很好,我知道,但是转义字符串仍然是一个有效的问题(恕我直言),您可能正在编写一个 shell例如,脚本而不是直接运行命令。
    • 这两种方法对shell都是一样的。
    • @Ignacio Vazquez-Abrams,通过“编写 shell 脚本”,我的意思是从 Python 生成一个 shell 脚本。 (生成一般运行的命令)
    • @Ignacio Vazquez-Abrams,我的问题中没有提到subprocess
    猜你喜欢
    • 2010-12-19
    • 2018-10-12
    • 2012-01-31
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    • 2019-12-08
    • 1970-01-01
    相关资源
    最近更新 更多