我想在python3中创建类似命令行/类似shell的界面。
Argparse似乎可以解析和显示帮助/错误消息。根据{{3}}的说法,有一个 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()
答案 0 :(得分:1)
实际上argparse
不会自动调用该方法-您必须自己执行。它所做的全部将方法添加到args的func
属性中。因此,您可以做的是检查func
属性是否存在,然后按以下方式调用它:
args = parser.parse_args(data)
if hasattr(args, 'func'):
args.func()
答案 1 :(得分:0)
我发现了如何使其工作:
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