Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用';argparse';?_Python_Python 2.7_Argparse - Fatal编程技术网

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中考虑最少的一个。