python 3 argparse调用一个函数

Posted

技术标签:

【中文标题】python 3 argparse调用一个函数【英文标题】:python 3 argparse call a function 【发布时间】:2018-12-09 20:20:42 【问题描述】:

我想在 python3 中创建一个类似命令行/类似 shell 的界面。

Argparse 似乎完成了解析和显示帮助/错误消息的工作。根据python3 documentation of argparse,有一个 func= 参数可用于获取 argparse 调用的函数

# sub-command functions
def foo(args):
   print(args.x * args.y)
def bar(args):
    print('((%s))' % args.z)
# create the top-level parser
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()
# create the parser for the "foo" command
parser_foo = subparsers.add_parser('foo')
parser_foo.add_argument('-x', type=int, default=1)
parser_foo.add_argument('y', type=float)
parser_foo.set_defaults(func=foo)
# create the parser for the "bar" command
parser_bar = subparsers.add_parser('bar')
parser_bar.add_argument('z')
parser_bar.set_defaults(func=bar)

但据我所知,help_parser.set_defaults(func=foo) 并没有调用我的功能。如果您能帮助我,我们将不胜感激。

您可以通过使用 python3 运行程序来重现该问题,输入 help 然后按 [Enter]。它没有按预期打印hello。 谢谢!

def foo():
    print('hello')


class Console:
    def __init__(self):
        """Console like interface for navigating and interacting with the external file system."""
        parser = argparse.ArgumentParser(
            description='Console like interface for navigating and interacting with the external file system.',
            add_help=False)
        subparsers = parser.add_subparsers(dest='command')
        subparsers.required = True

        help_parser = subparsers.add_parser('help')
        help_parser.add_argument('-x', type=int, default=1)
        help_parser.set_defaults(func=foo)

        setting_parser = subparsers.add_parser('settings')
        setting_subparsers = setting_parser.add_subparsers(dest='settings_command')
        setting_subparsers.required = True

        setting_save_parser = setting_subparsers.add_parser('save', help='Save the current settings in a .json file.')
        setting_save_parser.add_argument('file', type=str, nargs='?', default='settings.json')

        setting_load_parser = setting_subparsers.add_parser('load', description='Load the last settings from a .json file.')
        setting_load_parser.add_argument('file', type=str, nargs='?', help='settings.json')

        setting_set_parser = setting_subparsers.add_parser('set')
        setting_set_parser.add_argument('--host', type=str, required=True)
        setting_set_parser.add_argument('-u', '--username', type=str, required=True)
        setting_set_parser.add_argument('-p', '--password', type=str, required=True)
        setting_set_parser.add_argument('-x', '--proxy', type=str, required=False)

        while True:
            try:
                print('', flush=True, sep='')
                data = input('>>>').split(' ')
                print('your command:', data)
                parser.parse_args(data)
            except SystemExit:
                pass

if __name__ == '__main__':
    """Spawn an commandline like interface."""
    c = Console()

【问题讨论】:

【参考方案1】:

实际上argparse 不会自动调用该方法 - 你必须自己做。它所做的就是将方法添加到 args 的 func 属性中。因此,您可以做的是检查 func 属性是否存在,然后按如下方式调用它:

args = parser.parse_args(data)
if hasattr(args, 'func'):
    args.func()

【讨论】:

【参考方案2】:

我发现了如何使它工作: args.func() 将调用由 argparse 选择的函数。

print('', flush=True, sep='')
data = input('>>>').split(' ')
print('your command:', data)
args = parser.parse_args(data)
print(args)
args.func()

命令行日志:

>>>help
your command: ['help']
Namespace(command='help', func=<function foo at 0x0000023C3737F7B8>, x=1)
hello

【讨论】:

以上是关于python 3 argparse调用一个函数的主要内容,如果未能解决你的问题,请参考以下文章

如何使用选择性结构调用基于 argparse 的函数?

使用 argparse 将参数发送到 Python 脚本中的函数

Python argparse 忽略无法识别的参数

为啥直接调用 Python 脚本时 argparse 无法识别参数?

python中argparse模块简单使用

python之定义参数模块argparse的基本使用