shlex 保留双引号

  • 本文关键字:保留 shlex python shlex
  • 更新时间 :
  • 英文 :


我正在使用带有shlexPopen 作为带有 --exclude 标志的 yum 命令来传递要排除的包列表。出于某种原因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*']rn"

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


其次,你可以在 Popen 上使用 shell=True,你可以传递命令字符串 unsplit:

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

:这样字符串x就由 shell 直接解释 - 例如 bash。但是涉及额外的 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语法 - 例如通过REGEX:

>>> 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*"']

相关内容

  • 没有找到相关文章

最新更新