Python 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) ''

现在,我需要将其拆分为使用子流程模块运行。我尝试使用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过滤器后面的单引号正在被删除。我的文字中需要这些单引号。如何保存这些引号?

即使去掉了单引号,但在使用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))

另一种选择是直接传入文本,但存在一些安全问题。

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

这不是shlex问题:posix shell实际上也使用了单引号:

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) ']

引号的作用只是通过远程筛选器参数的空格。因此,对于您的用例来说,它是可以的。

如果你真的想让单引号进入一个子流程,那么额外的引号/转义是必要的:

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) '']

相关内容

  • 没有找到相关文章

最新更新