python - shlex 保留双引号吗?

标签 python shlex

我将 Popenshlex 一起用于 yum 命令,并使用 --exclude 标志来传递要排除的软件包列表。由于某种原因,shlex 似乎没有保留双引号。有什么指示我该怎么做吗?

>>> import shlex
>>> x = '/usr/bin/yum update --exclude=\"foo bar baz*\"'   
>>> print shlex.split(x)
['/usr/bin/yum', 'update', '--exclude=foo bar baz*']

关闭 POSIX 模式后,引号似乎放错了位置。

>>> print shlex.split(x,posix=False)
['/usr/bin/yum', 'update', '--exclude="foo', 'bar', 'baz*"']

最佳答案

首先,您的参数将通过正常的 shlex.split(x) 正确到达目标程序的 argv/argc - 如下所示:

>>> x = '/usr/bin/yum update --exclude=\"foo bar baz*\"' 
>>> l = shlex.split(x); l
['/usr/bin/yum', 'update', '--exclude=foo bar baz*']
>>> p = subprocess.Popen(['python', '-c', "import sys;print(sys.argv)"] + l, stdout=subprocess.PIPE)
>>> p.stdout.read()
"['-c', '/usr/bin/yum', 'update', '--exclude=foo bar baz*']\r\n"

:shell 上的引号用于将参数字符串保持在一起,以便在目标应用程序中正确拆分;并且使用 split 参数,分割已经完成。

<小时/>

其次,您可以在 Popen 上使用 shell=True 并且可以传递未分割的命令字符串:

p = subprocess.Popen(x, shell=True, ...)

:这样字符串 x 由 shell 直接解释 - 例如重击。但涉及额外的 shell 进程,消耗资源和运行时间

<小时/>

第三,如果您确实想通过 shlex.split 和直接程序调用将引号获取到目标程序中,并且您可以控制输入字符串,那么您可以编写像这样的输入字符串(额外引用与 shell(-mode) 中相同):

>>> x = '/usr/bin/yum update --exclude="\\"foo bar baz*\\""' 
>>> l = shlex.split(x); l
['/usr/bin/yum', 'update', '--exclude="foo bar baz*"']
>>> p = subprocess.Popen(['python', '-c', "import sys;print(sys.argv)"] + l, stdout=subprocess.PIPE)
>>> print(p.stdout.read())
['-c', '/usr/bin/yum', 'update', '--exclude="foo bar baz*"']

(注意:输入字符串中的一个反斜杠会被 python 语法消耗,除非您使用 r 语法编写它: x = r'/usr/bin/yum update --exclude="\"foo bar baz *\\""'

<小时/>

第四,如果您希望将带有引号的给定输入字符串输入到目标程序中,那么您需要使用自定义 shell 语法 - 例如通过正则表达式:

>>> x = '/usr/bin/yum update --exclude=\"foo bar baz*\"' 
>>> l = re.findall(r'(?:[^\s,"]|"(?:\\.|[^"])*")+', x); l
['/usr/bin/yum', 'update', '--exclude="foo bar baz*"']
>>> p = subprocess.Popen(['python', '-c', "import sys;print(sys.argv)"] + l, stdout=subprocess.PIPE)
>>> print(p.stdout.read())
['-c', '/usr/bin/yum', 'update', '--exclude="foo bar baz*"']

关于python - shlex 保留双引号吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35274815/

相关文章:

python - 使用 shlex 和子进程时出错

python - 如果 postgresql 不存在(列数和值不同)如何创建动态插入

python - 这些 python 实现中哪一个更好

python - Jinja2 - 复制变量而不是引用它

python , Windows : parsing command lines with shlex

Python:拆分字符串,尊重并保留引号

python - 从模式中解析出元素

python - 将参数列表作为输入传递给 SQL 查询

Python 按空格拆分字符串,除非在引号中,但保留引号

python - 使用 shlex 拆分多行字符串并保留引号字符