0

我有一个 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或文字星号*

更准确地说,我希望有一个子命令,我只是事先不知道所有子命令将是什么(或者我真的不想列出我要包装的工具的每个子命令)。


经过进一步思考,我意识到这种方法在某些方面对我的使用有些缺陷,尽管我认为这个功能可能在其他地方有它的用途,所以我会留下这个问题。

就我而言,查看我的工具的帮助与它所包含的帮助之间存在冲突。也就是说,我无法区分用户何时想要查看包装器的帮助或查看它所包装的工具的帮助。

4

1 回答 1

0

我觉得你可以试试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()
于 2020-05-20T05:12:11.057 回答