使用python的argparse,如何使子命令成为必需的参数?我想这样做是因为如果没有指定子命令,我希望argparse出错.我改写错误方法来打印帮助.我有3个深度嵌套子命令,所以这不是简单地在顶层处理零参数的问题.
在下面的示例中,如果这样调用,我得到:
$./simple.py
$
Run Code Online (Sandbox Code Playgroud)
我想要它做的是让argparse抱怨没有指定所需的子命令:
import argparse
class MyArgumentParser(argparse.ArgumentParser):
def error(self, message):
self.print_help(sys.stderr)
self.exit(0, '%s: error: %s\n' % (self.prog, message))
def main():
parser = MyArgumentParser(description='Simple example')
subs = parser.add_subparsers()
sub_one = subs.add_parser('one', help='does something')
sub_two = subs.add_parser('two', help='does something else')
parser.parse_args()
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
hpa*_*ulj 53
在所需参数的错误消息中有3.3的变化,子命令在灰尘中丢失.
http://bugs.python.org/issue9253#msg186387
在那里我建议这个工作,required在subparsers定义之后设置属性.
parser = ArgumentParser(prog='test')
subparsers = parser.add_subparsers()
subparsers.required = True
subparsers.dest = 'command'
subparser = subparsers.add_parser("foo", help="run foo")
parser.parse_args()
Run Code Online (Sandbox Code Playgroud)
一个相关的拉取请求:https://github.com/python/cpython/pull/3027
Hen*_*rik 13
除了hpaulj 的答案:您还可以使用required关键字参数 with ArgumentParser.add_subparsers()since Python 3.7。您还需要dest作为参数传递。否则你会得到一个错误:TypeError: sequence item 0: expected str instance, NoneType found.
示例文件example.py:
import argparse
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest='command', required=True)
foo_parser = subparsers.add_parser("foo", help="command foo")
args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)
不带参数的调用输出:
$ python example.py
usage: example.py [-h] {foo} ...
example.py: error: the following arguments are required: command
Run Code Online (Sandbox Code Playgroud)