[英]Python: argument parser that handles global options to sub-commands properly
argparse在处理接收全局选项的子命令时失败:
import argparse
p = argparse.ArgumentParser()
p.add_argument('--arg', action='store_true')
s = p.add_subparsers()
s.add_parser('test')
会有p.parse_args('--arg test'.split())
工作,
但在p.parse_args('test --arg'.split())
上失败了。
有谁知道python参数解析器正确处理子命令的全局选项?
试试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}
您可以轻松地将此参数添加到两个解析器(主解析器和子命令解析器):
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
编辑 :正如@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
更多示例/文档:
寻找在python中给出命令行参数的最佳方法,其中一些参数是某些选项的req,而一些参数是其他选项的req
Python argparse - 为多个subparser添加参数 (我不确定这个问题是否与这个问题不重叠)
这是一个肮脏的解决方法 -
import argparse
p = argparse.ArgumentParser()
p.add_argument('--arg', action='store_true')
s = p.add_subparsers()
s.add_parser('test')
def my_parse_args(ss):
#parse the info the subparser knows about; don't issue an error on unknown stuff
namespace,leftover=p.parse_known_args(ss)
#reparse the unknown as global options and add it to the namespace.
if(leftover):
s.add_parser('null',add_help=False)
p.parse_args(leftover+['null'],namespace=namespace)
return namespace
#print my_parse_args('-h'.split()) #This works too, but causes the script to stop.
print my_parse_args('--arg test'.split())
print my_parse_args('test --arg'.split())
这是有效的 - 您可以很容易地修改它以使用sys.argv
(只需删除拆分字符串“ ss
”)。 你甚至可以子类argparse.ArgumentParser
并更换parse_args
法my_parse_args
然后你永远不会知道其中的差别-尽管子类来取代单一的方法似乎矫枉过正我。
但是,我认为这是使用subparser的一种非标准方式。 一般来说,预计全局期权将出现在subsparser期权之前,而不是之后。
解析器具有特定语法: command <global options> subcommand <subcommand ptions>
,您尝试使用选项提供子命令,但您没有定义一个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.