Python 保留双引号?

Python 保留双引号?,python,shlex,Python,Shlex,我正在对带有--exclude标志的yum命令使用Popen和shlex,以传递要排除的包的列表。出于某种原因,shlex似乎没有保留双引号。我该怎么做 >>> import shlex >>> x = '/usr/bin/yum update --exclude=\"foo bar baz*\"' >>> print shlex.split(x) ['/usr/bin/yum', 'update', '--exclude=foo ba

我正在对带有
--exclude
标志的yum命令使用
Popen
shlex
,以传递要排除的包的列表。出于某种原因,
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上的引号用于将参数字符串保存在一起,以便在目标应用程序中正确拆分;使用拆分参数,拆分已经完成


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

p = subprocess.Popen(x, shell=True, ...)
:通过这种方式,shell直接解释字符串
x
,例如bash。但是需要一个额外的shell进程,它会消耗资源和运行时间


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

(注意:输入字符串中的一个反斜杠由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*"']

在保留双引号内的字符串时,这似乎起到了作用。任何指针都指示如何进一步拆分此命令,不包括--exclude?x=r'/usr/bin/yum update--exclude=“foo bar baz*”>>print re.split(“(?=[)”,x)['/usr/bin/yum update--exclude=“foo bar baz*”]
>>> 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*"']