2013-07-16 77 views
2

我有以下文字:的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过滤后的单引号被删除。我需要在我的文本中使用这些单引号。我如何去保留这些引号?

回答

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) 
0

它不是一个shlex问题:POSIX外壳程序也消耗了单引号的作用:

[email protected]:~$ 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) '] 

引号目的只是为了打通远程过滤争论的空间。所以它适用于你的用例。

如果你真的想要得到的单引号变成一个子进程,那么额外的报价/转义是必要的:

[email protected]:~$ 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) \'']