Python中的gem/git-style命令行参数

Dav*_*sky 22 python command-line-interface

是否有用于执行 gem/git样式命令行参数的Python模块?我的意思是gem/git风格是:

$ ./MyApp.py
The most commonly used MyApp commands are:
  add        Add file contents to the index
  bisect     Find by binary search the change that introduced a bug
  branch     List, create, or delete branches
  checkout   Checkout a branch or paths to the working tree
  ...

$ ./MyApp.py branch
  * current-branch
    master
Run Code Online (Sandbox Code Playgroud)

没有参数,输出会告诉您如何继续.还有一个特殊的"帮助"命令:

$ ./MyApp.py help branch
Run Code Online (Sandbox Code Playgroud)

这将为您提供有关"分支"命令的更深入的提示.

编辑: 通过执行我的意思是它为您执行使用打印,退出无效输入,根据您的CLI规范运行您的功能.为命令行排序"URL映射器".

Rik*_*ggi 34

是的,argparse有add_subparsers().

在子命令部分中已经很好地解释了这一点.

从那里复制其中一个例子:

>>> parser = argparse.ArgumentParser()
>>> subparsers = parser.add_subparsers()
>>> checkout = subparsers.add_parser('checkout', aliases=['co'])
>>> checkout.add_argument('foo')
>>> parser.parse_args(['checkout', 'bar'])
Namespace(foo='bar')
Run Code Online (Sandbox Code Playgroud)

编辑:不幸的是,没有自生成的特殊help命令,但是您可以获得详细的帮助消息(您似乎想要)-h或者--help通常在命令之后使用:

$ ./MyApp.py branch --help
Run Code Online (Sandbox Code Playgroud)

通过详细说明我并不是说这就像一个手册页,它就像其他任何--help一种帮助:列出所有的参数等等......

例:

>>> parser = argparse.ArgumentParser()
>>> subparsers = parser.add_subparsers(description='Sub description')
>>> checkout = subparsers.add_parser('checkout', description='Checkout description')
>>> checkout.add_argument('foo', help='This is the foo help')
>>> parser.parse_args(['checkout', '--help'])
usage:  checkout [-h] foo

Checkout description

positional arguments:
  foo         This is the foo help

optional arguments:
  -h, --help  show this help message and exit
Run Code Online (Sandbox Code Playgroud)

如果需要,应该很容易实现help重定向到的命令--help.


dan*_*nny 6

获得 gem/git 风格的“帮助”行为的合理黑客(我只是为我正在做的事情写了这个):

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(dest='sub_commands')
parser_branch = subparsers.add_parser('branch', description='list of branches')
parser_help = subparsers.add_parser('help')
parser_help.add_argument('command', nargs="?", default=None)

# I can't find a legitimate way to set a default subparser in the docs
#   If you know of one, please let me know!
if len(sys.argv) < 2:
    sys.argv.append('--help')

parsed = parser.parse_args()

if parsed.sub_commands == "help":
    if not parsed.command:
        parser.parse_args(['--help'])
    else:
        parser.parse_args([parsed.command, '--help'])
Run Code Online (Sandbox Code Playgroud)

argparse绝对是我遇到的 optparse 和其他 python 解决方案的一个进步。但是 IMO 处理 args 的 gem/git 风格只是一种更合乎逻辑和更安全的做事方式,因此不支持它很烦人。