Python optparse和参数中的空格

时间:2010-10-01 13:50:46

标签: python optparse

当使用optparse时,我希望在选项后得到整个字符串,但我只能将它的一部分放到第一个空格中。

e.g:

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]

它有效。但我放弃了可执行文件的参数。

如果第一个地方没有得到字符串,则子进程模块会从列表构建cmdline,所以我暂时无法解释这种行为。

5 个答案:

答案 0 :(得分:12)

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

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

答案 1 :(得分:6)

我找到了另一个很好的替代方法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"']

答案 2 :(得分:4)

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

大多数shell会在空格中拆分argv项目,除非你告诉他们不要引用或转义。

报价按上述方式工作。

在许多炮弹中你可以这样做:

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

反斜杠会在不需要引号的情况下转义以下空格。

答案 3 :(得分:4)

如果您知道要获得的参数标记后面有多少个单词,您可以修改--executableoptparse选项的方式来正确处理这种情况:

您可以设置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)

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

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

有关optparse的更多信息,请查看http://docs.python.org/library/optparse.html,并记住它自2.7以来已被弃用,赞成argparse

答案 4 :(得分:1)

如果您无法升级到argparse,请完成此答案列表。

Optparse无法处理这些情况(多个字符串)。你只能使用nargs来指定特定数量的valiables,但没有什么比“一个或多个”更好。您需要破解使用不同的库(例如argparse或其他)。