Python shlex.split()不能保留单引号

时间:2013-07-16 19:04:37

标签: python regex split lex shlex

我有以下文字:

'sudo -S java -cp spinn3r-client-3.4.06.jar com.spinn3r.api.Main --vendor=test --remote-filter=\'(and (eq source:publisher_type " WEBLOG") (eq dc_lang:English) \''

现在我需要将其拆分为使用子进程模块运行。我尝试使用shlex.split。我得到了以下内容:

['sudo',
 '-S',
 'java',
 '-cp',
 'spinn3r-client-3.4.06.jar',
 'com.spinn3r.api.Main',
 '--vendor=test',
 '--remote-filter=(and (eq source:publisher_type " WEBLOG") (eq dc_lang:English) ']

如您所见,正在删除--remote-filter之后的单引号。我在文中需要这些单引号。我该如何保留这些报价?

2 个答案:

答案 0 :(得分:1)

即使它删除了单引号,但在使用subprocess时似乎可以解释为正确。

#!/bin/bash
# > someScript
echo ${1} # sudo
echo ${2} # -S
echo ${3} # --vendor=test
echo ${4} # --remote-filter=(simple) (<--space-->)
echo ${5} # --foo
echo ${6} # bar
#!/usr/bin/env python
import subprocess, shlex

subprg = (
    './someScript sudo -S --vendor=test '
    '--remote-filter=\'(simple) (<--space-->) \' --foo bar')

subprocess.call(shlex.split(subprg))

另一种方法是直接传入文本,但有一些security issues

subprocess.call('./someScript sudo -S ...', shell=True)

答案 1 :(得分:0)

它不是for k in range(len(nums)): nums[k] = int(nums[k]); 问题:posix shell也会使用有效的单引号:

shlex

引号的目的只是为了获取 remote-filter 参数的空格。所以它可以用于你的用例。

如果您真的想将单引号引入子流程,则需要额外的引用/转义:

user@debi:~$ python -c "import sys;print sys.argv" sudo -S java -cp spinn3r-client-3.4.06.jar com.spinn3r.api.Main --vendor=test --remote-filter='(and (eq source:publisher_type " WEBLOG") (eq dc_lang:English) '
['-c', 'sudo', '-S', 'java', '-cp', 'spinn3r-client-3.4.06.jar', 'com.spinn3r.api.Main', '--vendor=test', '--remote-filter=(and (eq source:publisher_type " WEBLOG") (eq dc_lang:English) ']