【问题标题】:Python optparse and spaces in an argumentPython optparse 和参数中的空格
【发布时间】:2011-10-22 04:58:44
【问题描述】:

当使用 optparse 时,我想在一个选项之后获取整个字符串,但我只得到它的一部分直到第一个空格。

例如:

python myprog.py --executable python someOtherProg.py

我在“可执行文件”中得到的只是“python”。

是否可以使用 optparse 解析这些行,还是必须使用 argparse 来解析?

€:我已经尝试将它包含在 "s 中。但是在深入研究代码后,我发现子进程调用无法处理参数。

带有命令行的字符串被塞进一个列表“args”中。

args = [self.getExecutable()] + self.getArgs().split()

好像

"[python D:\\\workspace\\\myprog\\\src\\\myprog.py]"

这给了我系统找不到文件异常。当我使用

args[0]

它有效。但是我放弃了可执行文件的论点。

如果 subprocess 模块一开始没有得到字符串,它会从列表中构建一个命令行,所以我目前无法解释这种行为。

【问题讨论】:

    标签: python optparse


    【解决方案1】:

    您可以将它们括在引号中以使它们与现有代码一起使用。

    python myprog.py --executable "python someOtherProg.py"
    

    是否可以使用 optparse 解析这些行,还是必须使用 argparse 来解析?

    我不知道您是否/如何使用optparse 来做到这一点,因为我还没有真正使用过optparse

    不过,我可以通过 argparse 帮助您。这是一个简单的例子:

    #!/usr/bin/python
    import argparse, sys
    
    if __name__ == '__main__':
        parser = argparse.ArgumentParser(description = 'Demonstration of Argparse.')
        parser.add_argument('-e', '--executable', nargs = '+', help = 'List of executables')
        args = parser.parse_args(sys.argv[1:])
        print args.executable
    

    及用法:

    manoj@maruti:~$ python myprog.py --executable python someOtherProg.py
    ['python', 'someOtherProg.py']
    

    我还建议从 optparse 切换到 argparse。从 2.7 开始,Optparsedeprecated

    【讨论】:

      【解决方案2】:

      我找到了另一个不错的选择 shlex - 用于简单的类似 shell 的语法的词法分析器类。

      来源链接:How to parse a command line with regular expressions?

      >>> import shlex
      >>> shlex.split('"param 1" param2 "param 3"')
      ['param 1', 'param2', 'param 3']
      >>> shlex.split('"param 1" param2 "param 3"')
      Traceback (most recent call last):
          [...]
      ValueError: No closing quotation
      >>> shlex.split('"param 1" param2 "param 3\\""')
      ['param 1', 'param2', 'param 3"']
      

      【讨论】:

        【解决方案3】:

        您看到的行为来自这样一个事实,即解析命令行并将其分成 sys.argv 的单词的是您的 shell,而不是 python。 Python 由 shell 通过 exec() 启动,argv 已经填充。

        大多数 shell 会在空格处拆分 argv 项目,除非您通过引用或转义告诉它们不要这样做。

        引号的工作方式如上所述。

        在许多 shell 中你可以这样做:

        python myprog.py --executable python\ someOtherProg.py
        

        反斜杠转义后面的空格而不需要引号。

        【讨论】:

        • 准备被惊呆了:在 Python 3.5 下,转义的空间不会被 sys.argv 转义!在 C 语言中,我们有 silly python some : argv[1] = "python", argv[2] = "some"silly "python some"argv[1] = "python some"。和silly python\ someargv[1] = "python some"。但是对于 Python 3.5,我们有 silly.py python some : argv[1] = "python", argv[2] = "some"silly.py "python some"argv[1] = "python some"。还有silly.py python\ someargv[1] = "python\\""some"。太棒了!
        【解决方案4】:

        如果您知道要获取的参数标志后面有多少个单词,您可以修改在optparse 中创建--executable 选项的方式以正确处理这种情况:

        您可以将optparse 解析器设置为查找两个(或更多)单词,而不是在选项标志之后使用单个字:

        from optparse import OptionParser
        parser = OptionParser()
        
        parser.add_option("-f", "--file", action="store", dest="filename",
                               help="File to be processed.", metavar="FILE")
        parser.add_option("-e", "--executable", action="store", dest="my_exe",
                               help="Command to be executed", metavar="EXE",
                               nargs=2)
        

        在这个 sn-p 中,-f--file 选项只需要一个单词并将其作为字符串(默认值)存储在 filename 变量中。

        相比之下,-e--executable 选项由于 nargs=2 选项而需要两个单词。这将导致在 -e--executable 标志后面找到的两个单词作为字符串存储在 Python 列表 my_exe 中。

        查看:http://docs.python.org/library/optparse.html 以了解有关 optparse 的更多信息,并记住它已从 2.7 开始弃用,取而代之的是 argparse

        【讨论】:

          【解决方案5】:

          如果您无法升级到 argparse,则只是为了最终确定此答案列表。

          Optparse 无法处理这些情况(多个字符串)。您只能使用 nargs 来指定特定数量的变量,但没有像“一个或多个”这样的东西。您需要破解它或使用不同的库(例如 argparse 或其他)。

          【讨论】:

          • 你能告诉我如何使用 argparse 来处理它吗?不使用 sys.argv 我猜 argparse 也没有像 parse_string 而不是 parse_args 的功能,例如解析具有空格的字符串,如"one or more"
          • argparse 也很有限,我没有太多经验:-(
          • 查看我提供的另一个解决方案,应该使用 argparse 以及 optparse 作为独立的 shlex lib。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-10-13
          • 2011-08-29
          • 1970-01-01
          • 1970-01-01
          • 2011-11-22
          • 2013-02-07
          • 2014-10-22
          相关资源
          最近更新 更多