当前位置:  开发笔记 > 编程语言 > 正文

Python模块到shellquote/unshellquote?

如何解决《Python模块到shellquote/unshellquote?》经验,为你挑选了4个好方法。

Python标准库中是否有任何内容可以正确解析/解析字符串以便在shell命令中使用?我正在寻找perl的python模拟String::ShellQuote::shell_quote:

$ print String::ShellQuote::shell_quote("hello", "stack", "overflow's", "quite", "cool")
hello stack 'overflow'\''s' quite cool

而且,更重要的是,它会在相反的方向上起作用(取一个字符串并将其分解为一个列表).



1> YGA..:

好像

try:  # py3
    from shlex import quote
except ImportError:  # py2
    from pipes import quote

quote("hello stack overflow's quite cool")
>>> '"hello stack overflow\'s quite cool"'

让我足够远.


在Windows上,`subprocess.list2cmdline`更准确.`pipes.quote`总是使用单引号,这在Windows命令行环境中是不可接受的.

2> dnozay..:

pipes.quote现在是shlex.quote在python 3中.使用那段代码很容易.

https://github.com/python/cpython/blob/master/Lib/shlex.py#L281

该版本正确处理零长度参数.



3> John Wiseman..:

我很确定pipes.quote已经坏了,不应该使用,因为它没有正确处理零长度参数:

>>> from pipes import quote
>>> args = ['arg1', '', 'arg3']
>>> print 'mycommand %s' % (' '.join(quote(arg) for arg in args))
mycommand arg1  arg3

我相信结果应该是这样的

mycommand arg1 '' arg3


在约翰的倡议下,[这已在Python 2.6中修复.](http://bugs.python.org/issue7476)

4> 小智..:

对于shell引用,这是有效的:我在Posix上进行了严格的测试.[我假设list2cmdlinePython提供的函数与Windows上宣传的一样工作]

# shell.py
import os
if os.name == 'nt':
    from subprocess import list2cmdline

    def quote(arg):
        return list2cmdline([arg])[0]
else:
    import re
    _quote_pos = re.compile('(?=[^-0-9a-zA-Z_./\n])')

    def quote(arg):
        r"""
        >>> quote('\t')
        '\\\t'
        >>> quote('foo bar')
        'foo\\ bar'
        """
        # This is the logic emacs uses
        if arg:
            return _quote_pos.sub('\\\\', arg).replace('\n',"'\n'")
        else:
            return "''"

    def list2cmdline(args):
        return ' '.join([ quote(a) for a in args ])

如果有人关心,测试就在这里.

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有