首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用argparse获取选定的子命令

使用argparse获取选定的子命令
EN

Stack Overflow用户
提问于 2011-01-02 04:59:18
回答 2查看 52.5K关注 0票数 159

当我在python argparse中使用子命令时,我可以获得所选的参数。

代码语言:javascript
复制
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]是行不通的。如何获取子命令本身?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-02 05:10:51

Python docs on argparse sub-commands的最底部解释了如何做到这一点:

代码语言:javascript
复制
>>> 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()方法。

票数 217
EN

Stack Overflow用户

发布于 2021-08-27 09:42:56

我只是想把这个答案贴出来,因为这在我最近的一些工作中非常有用。这种方法使用了装饰符(尽管没有与传统的@语法一起使用),如果推荐的set_defaults已经用于子解析器,那么它会特别方便。

代码语言:javascript
复制
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函数中的某个类属性或全局变量,而不是直接传递它,也可以将其修改为函数的传统装饰器,尽管这需要添加另一个层。

这样就有了对对象的直接引用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4575747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档