当我在python argparse中使用子命令时,我可以获得所选的参数。
parser = argparse.ArgumentParser()
parser.add_argument('-g', '--global')
subparsers = parser.add_subparsers()
foo_parser = subparsers.add_parser('foo')
foo_parser.add_argument('-c', '--count')
bar_parser = subparsers.add_parser('bar')
args = parser.parse_args(['-g', 'xyz', 'foo', '--count', '42'])
# args => Namespace(global='xyz', count='42')
所以args
不包含'foo'
。由于可能存在全局参数,简单地编写sys.argv[1]
是行不通的。如何获取子命令本身?
发布于 2011-01-02 05:10:51
Python docs on argparse sub-commands的最底部解释了如何做到这一点:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-g', '--global')
>>> subparsers = parser.add_subparsers(dest="subparser_name") # this line changed
>>> foo_parser = subparsers.add_parser('foo')
>>> foo_parser.add_argument('-c', '--count')
>>> bar_parser = subparsers.add_parser('bar')
>>> args = parser.parse_args(['-g', 'xyz', 'foo', '--count', '42'])
>>> args
Namespace(count='42', global='xyz', subparser_name='foo')
您还可以使用我找到的示例上面引用的set_defaults()
方法。
发布于 2021-08-27 09:42:56
我只是想把这个答案贴出来,因为这在我最近的一些工作中非常有用。这种方法使用了装饰符(尽管没有与传统的@语法一起使用),如果推荐的set_defaults
已经用于子解析器,那么它会特别方便。
import argparse
from functools import wraps
import sys
def foo(subparser):
subparser.error('err')
def bar(subparser):
subparser.error('err')
def map_subparser_to_func(func, subparser):
@wraps(func)
def wrapper(*args, **kwargs):
return func(subparser, *args, **kwargs)
return wrapper
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()
foo_parser = subparsers.add_parser('foo')
foo_parser.set_defaults(func = map_subparser_to_func(foo, foo_parser))
bar_parser = subparsers.add_parser('bar')
bar_parser.set_defaults(func = map_subparser_to_func(bar, bar_parser))
args = parser.parse_args(sys.argv[1:])
args.func()
可以修改map_subparser_to_func
函数以将子解析器设置为wrapper
函数中的某个类属性或全局变量,而不是直接传递它,也可以将其修改为函数的传统装饰器,尽管这需要添加另一个层。
这样就有了对对象的直接引用。
https://stackoverflow.com/questions/4575747
复制相似问题