我有一个python脚本,希望用作另一个命令行工具的包装。我想拦截所有已定义的子命令,但要通过所有其他子命令和参数。我尝试使用似乎很理想的子解析器,但似乎不允许接受通用的未定义命令,类似于parse_known_args
对常规ArgumentParser
所做的操作。
我目前拥有的:
ap = argparse.ArgumentParser()
subparsers = ap.add_subparsers(
title="My Subparser",
)
upload_parser = subparsers.add_parser('upload', help='upload help')
upload_parser.add_argument(
'path',
help="Path to file for upload"
)
upload_parser.add_argument(
'--recursive',
'-r',
action='store_true',
)
我想添加:
generic_parser = subparser.add_parser('*', help='generic help') # "*" to indicate any other value
generic_parser.add_argument(
'args',
nargs='*',
help='generic command arguments for passthru'
)
这不起作用,因为它只希望使用upload
或文字星号*
。
更确切地说,我希望有一个子命令,我只是事先不知道所有子命令将是什么(或者,实际上,我不想列出要包装的工具的每个子命令) 。
进一步思考,我已经意识到这种方法在某些方面对我的使用是有缺陷的,尽管我认为此功能可能会在其他地方使用,所以我将问题抛在脑后。
就我而言,在看到我的工具的帮助与其包装的帮助之间存在冲突。也就是说,我无法区分用户是希望看到包装程序的帮助还是何时看到其包装的工具的帮助。
我认为您可以尝试Click,它确实功能强大且易于使用!
仅检查此示例
import click
@click.command()
@click.option('--count', default=1, help='Number of greetings.')
@click.option('--name', prompt='Your name',
help='The person to greet.')
def hello(count, name):
"""Simple program that greets NAME for a total of COUNT times."""
for x in range(count):
click.echo('Hello %s!' % name)
if __name__ == '__main__':
hello()