Python:参数解析器,可以正确处理子命令的全局选项

Ron*_*nny 7 python parsing command-line-arguments argparse subcommand

argparse在处理接收全局选项的子命令时失败:

import argparse
p = argparse.ArgumentParser()
p.add_argument('--arg', action='store_true')
s = p.add_subparsers()
s.add_parser('test')
Run Code Online (Sandbox Code Playgroud)

会有p.parse_args('--arg test'.split())工作,
但失败了p.parse_args('test --arg'.split()).

有谁知道python参数解析器正确处理子命令的全局选项?

Vla*_*hev 6

试试docopt:

>>> from docopt import docopt

>>> usage = """
... usage: prog.py command [--test]
...        prog.py another [--test]
... 
... --test  Perform the test."""

>>> docopt(usage, argv='command --test')
{'--test': True,
 'another': False,
 'command': True}

>>> docopt(usage, argv='--test command')
{'--test': True,
 'another': False,
 'command': True}
Run Code Online (Sandbox Code Playgroud)


pal*_*luh 6

您可以轻松地将此参数添加到两个解析器(主解析器和子命令解析器):

import argparse                                                                  

main = argparse.ArgumentParser()                                                    
subparser = main.add_subparsers().add_parser('test')                                        

for p in [main,subparser]:                                                                  
   p.add_argument('--arg', action='store_true')                                 

print main.parse_args('--arg test'.split()).arg                                     
print main.parse_args('test --arg'.split()).arg
Run Code Online (Sandbox Code Playgroud)

编辑:正如@hpaulj 在评论中指出的,还有一个parents参数可以传递给ArgumentParser构造函数或add_parser方法。您可以在此值解析器中列出作为新值解析器的基础。

import argparse

base = argparse.ArgumentParser(add_help=False)
base.add_argument('--arg', action='store_true')

main = argparse.ArgumentParser(parents=[base])
subparser = main.add_subparsers().add_parser('test', parents=[base])

print main.parse_args('--arg test'.split()).arg
print main.parse_args('test --arg'.split()).arg
Run Code Online (Sandbox Code Playgroud)

更多示例/文档:

寻找在python中给出命令行参数的最佳方式,其中一些参数是某些选项的req,而一些参数是其他选项的req

Python argparse - 向多个子解析器添加参数(我不确定这个问题是否与这个问题重叠太多)

http://docs.python.org/dev/library/argparse.html#parents

  • 如果有更多可选项,它们可以在 `parent` 解析器中定义,并通过 `parents` 参数添加到 `p` 和 `s`。http://stackoverflow.com/a/18346152/901925 有一个向许多子解析器添加相同选项集的示例。 (2认同)