Python 如何使用';argparse';?
是否有方法在中指定两个必需的参数,一个对应于子命令,另一个对应于所有子命令 我能做的最亲密的事情似乎是和你在一起Python 如何使用';argparse';?,python,python-2.7,argparse,Python,Python 2.7,Argparse,是否有方法在中指定两个必需的参数,一个对应于子命令,另一个对应于所有子命令 我能做的最亲密的事情似乎是和你在一起 import argparse parser = argparse.ArgumentParser() subparsers = parser.add_subparsers(help='', dest='command', metavar='COMMAND', title='required arguments',
import argparse
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(help='', dest='command', metavar='COMMAND', title='required arguments',
description='two arguments are required')
parser.add_argument('config', metavar='CONFIG', action='store', help='the config to use')
cmda_parser = subparsers.add_parser('cmdA', help='a first command')
cmdb_parser = subparsers.add_parser('cmdB', help='the second operation')
cmdc_parser = subparsers.add_parser('cmdC', help='yet another thing')
print(parser.parse_args())
给
usage: enigma.py [-h] COMMAND ... CONFIG
positional arguments:
CONFIG the config to use
optional arguments:
-h, --help show this help message and exit
required arguments:
two arguments are required
COMMAND
cmdA a first command
cmdB the second operation
cmdC yet another thing
以及不显示CONFIG
的子命令的帮助;但我想要的是
usage: enigma.py [-h] COMMAND CONFIG
required arguments:
two arguments are required
COMMAND
cmdA a first command
cmdB the second operation
cmdC yet another thing
CONFIG the config to use
optional arguments:
-h, --help show this help message and exit
以及显示CONFIG
的每个子命令的帮助,例如
usage: enigma.py cmdA CONFIG [-h]
required arguments:
CONFIG the config to use
optional arguments:
-h, --help show this help message and exit
有没有办法做到这一点
如何指定两个必需参数,其中一个是子命令,第二个作为必需参数“传播”到每个子命令?对于您定义的解析器,
命令和配置都是必需的。举个例子
python myprog cmdA
你应该得到一个遗漏的参数错误。在较新版本上,它将是显式的
0826:~/mypy$ python3.5 stack33463052.py cmdA
usage: stack33463052.py [-h] COMMAND ... CONFIG
stack33463052.py: error: the following arguments are required: CONFIG
但是,是的,命令
不会出现在子parser的帮助中。那是因为下级军官对此一无所知。它是为主解析器定义的
如果我将CONFIG
定义移动到创建子parser
之前,我会得到:
0833:~/mypy$ python stack33463052.py tst cmdA -h
usage: stack33463052.py CONFIG cmdA [-h]
optional arguments:
-h, --help show this help message and exit
现在,CONFIG
出现在用法中。这是因为代码在定义子parser时知道这个参数。但是-在寻求此帮助时,我必须为CONFIG
包含一个值
(编辑)
CONFIG
出现在cmdA
用法中,因为它是在创建解析器时添加到其prog
属性中的:
print(cmda_parser.prog)
'stack33463052.py CONFIG cmdA'
但如果以后将参数添加到解析器中,则不会修改prog
在下面的例子中,cmdA
被作为CONFIG
的参数,而不是COMMAND
,因此我得到了默认的主解析器帮助
0833:~/mypy$ python stack33463052.py cmdA -h
usage: stack33463052.py [-h] CONFIG COMMAND ...
positional arguments:
CONFIG the config to use
optional arguments:
...
对于主解析器,CONFIG
和COMMAND
都是必需的位置。命令没有什么特别之处,只是它有3个定义的选项
为每个子parser定义CONFIG
,可能是最佳选择。它需要更多的输入,但会显示在正确的帮助中。如果从概念上讲,它与命令的联系比与主解析器的联系更紧密,那么就需要使用它们来定义它。所有命令都需要它这一事实并不重要
一般来说,在使用子解析器时,最好对vebosity和logging等主解析器值使用optionals,并在子解析器中定义其余值。它使解析器之间的工作分工更加清晰。如果需要,我可以详细说明
没有传播机制。但我当然可以编写一个函数,为每个子parser添加一个公共参数
def foo(subparsers, *args, **kwargs):
sub = subparsers.add_parser(*args, **kwargs)
sub.add_argument('config')
return sub
在交互式shell中运行解析器设置,并检查每个命令创建的对象-parser
,子parser
,cmda\u parser
,等等,可能会很有帮助。parser
知道的参数(操作对象)列表在parser.\u actions
中
argparse
模块中的程序清晰和简洁意味着parser
和cmda\u parser
是不同的ArgumentParser
对象。一个不仅仅是另一个的模式或方法。子parsers
对象(动作子类)是解析器
和cmda\u解析器
之间唯一的形式链接
还可以尝试:
parser.print_help() # or parser.print_usage()
cmda_parser.print_help()
这有助于显示这两个解析器的帮助
是独立的。解析器可以使用parents
属性从另一个解析器“继承”参数
import argparse
parser = argparse.ArgumentParser()
# Put common subparser arguments here. Each sub parser will have
# its own -h option, so disable it on the shared base.
subbase = argparse.ArgumentParser(add_help=False)
subbase.add_argument('config', metavar='CONFIG', action='store', help='the config to use')
subparsers = parser.add_subparsers(help='', dest='command', metavar='COMMAND', title='required arguments',
description='two arguments are required')
# Add subbase to the parent list for each subparser.
cmda_parser = subparsers.add_parser('cmdA', parents=[subbase], help='a first command')
cmdb_parser = subparsers.add_parser('cmdB', parents=[subbase], help='the second operation')
cmdc_parser = subparsers.add_parser('cmdC', parents=[subbase], help='yet another thing')
print(parser.parse_args())
你试过先定义配置吗?@hpaulj:CONFIG在命令之后。然后为每个子parser定义它。@hpaulj:问题的关键是看这是否可以避免。避免这样做的目的是什么?它会让代码更清晰,还是更简短?在argparse
中没有“传播”机制。我想是接近了。但是,在请求帮助时,如果没有指定参数,则不会将CONFIG
列为两个必需参数之一。必须使用script.py cmdA-h
才能将CONFIG
列为参数。这是子解析器的参数,而不是主解析器的参数。这就引出了另一个问题——主解析器帮助中没有显示任何子解析器参数。每个解析器(包括主解析器)只显示自己的参数。是关于显示主解析器和子解析器帮助的几个问题之一。不完全是我想要的,但它说明了为什么argparse阻止我这样做。这是我使用过的Python API中考虑最少的一个。