【问题标题】:Python shlex.split() cannot retain single quotesPython shlex.split() 不能保留单引号
【发布时间】:2013-07-16 19:04:37
【问题描述】:

我有以下文字:

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

现在我需要拆分它以使用 subprocess 模块运行。我尝试使用 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 之后的单引号被删除。我的文本中需要这些单引号。我该如何保留这些报价?

【问题讨论】:

    标签: python regex split lex shlex


    【解决方案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)
    

    【讨论】:

      【解决方案2】:

      这不是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) ']
      

      引号的目的只是为了让 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) \'']
      

      【讨论】:

        猜你喜欢
        • 2017-04-22
        • 2011-10-15
        • 2019-10-04
        • 2020-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-21
        • 2015-11-11
        相关资源
        最近更新 更多