如何使用默认子命令,或处理没有使用子命令的情况argparse?
import argparse
a = argparse.ArgumentParser()
b = a.add_subparsers()
b.add_parser('hi')
a.parse_args()
Run Code Online (Sandbox Code Playgroud)
在这里,我想要选择一个命令,或者只根据下一个最高级别的解析器(在这种情况下是顶级解析器)处理的参数.
joiner@X:~/src> python3 default_subcommand.py
usage: default_subcommand.py [-h] {hi} ...
default_subcommand.py: error: too few arguments 我有以下代码(使用Python 2.7):
# shared command line options, like --version or --verbose
parser_shared = argparse.ArgumentParser(add_help=False)
parser_shared.add_argument('--version', action='store_true')
# the main parser, inherits from `parser_shared`
parser = argparse.ArgumentParser(description='main', parents=[parser_shared])
# several subcommands, which can't inherit from the main parser, since
# it would expect subcommands ad infinitum
subparsers = parser.add_subparsers('db', parents=[parser_shared])
...
args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)
现在我希望能够调用此程序,例如--version附加到正常程序或某个子命令:
$ prog --version
0.1
$ prog db --version
0.1
Run Code Online (Sandbox Code Playgroud)
基本上,我需要声明可选的subparsers.我知道这不是真的支持,但有没有任何变通方法或替代方案?
编辑:我收到的错误消息:
$ prog db --version
# works fine
$ prog --version
usage: …Run Code Online (Sandbox Code Playgroud) 我正在使用argparse,我正在尝试混合子命令和位置参数,并出现了以下问题.
这段代码运行正常:
import argparse
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()
parser.add_argument('positional')
subparsers.add_parser('subpositional')
parser.parse_args('subpositional positional'.split())
Run Code Online (Sandbox Code Playgroud)
上面的代码将args解析为Namespace(positional='positional'),但是当我更改位置参数以使nargs ='?'时 因此:
import argparse
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers()
parser.add_argument('positional', nargs='?')
subparsers.add_parser('subpositional')
parser.parse_args('subpositional positional'.split())
Run Code Online (Sandbox Code Playgroud)
它出错了:
usage: [-h] {subpositional} ... [positional]
: error: unrecognized arguments: positional
Run Code Online (Sandbox Code Playgroud)
为什么是这样?
我知道这个问题已经被提出,但我正在寻找具有特定功能的Java cli解析器.我希望它能够定义命令行树,从而使用子命令(和多个级别深度).因此,在我到达选项之前,我可以有3-4级命令.这些子命令是互斥的.谢谢
使用cmdln在Python中实现"嵌套"子命令.
我不确定我在这里使用正确的术语.我正在尝试使用cmdln实现一个命令行工具,它允许"嵌套"子命令.这是一个真实世界的例子:
git svn rebase
Run Code Online (Sandbox Code Playgroud)
实现这个的最佳方法是什么?我一直在doc,这里和整个网络上搜索关于这方面的更多信息,但是空洞了.(也许我正在用错误的术语进行搜索.)
如果没有自动执行此操作的未记录功能,我最初的想法是让前一个子命令处理程序确定存在另一个子命令并再次调度命令调度程序.我查看了cmdln的内部结构,调度程序是一个私有方法,_dispatch_cmd.我的下一个想法是创建我自己的子子命令调度程序,但这似乎不太理想和混乱.
任何帮助,将不胜感激.
argparse在处理接收全局选项的子命令时失败:
import argparse
p = argparse.ArgumentParser()
p.add_argument('--arg', action='store_true')
s = p.add_subparsers()
s.add_parser('test')
Run Code Online (Sandbox Code Playgroud)
会有p.parse_args('--arg test'.split())工作,
但失败了p.parse_args('test --arg'.split()).
有谁知道python参数解析器正确处理子命令的全局选项?
我需要实现一个命令行界面,程序接受子命令.
例如,如果程序名为"foo",则CLI看起来像
foo cmd1 <cmd1-options>
foo cmd2
foo cmd3 <cmd3-options>
Run Code Online (Sandbox Code Playgroud)
cmd1并且cmd3必须与其中至少一个选项一起使用,并且这三个cmd*参数始终是独占的.
我试图在argparse中使用subparser,但暂时没有成功.问题是cmd2,没有参数:
如果我尝试添加不带参数的subparser条目,则返回的命名空间parse_args将不包含任何告知我已选择此选项的信息(请参阅下面的示例).如果我尝试cmd2作为参数添加parser(而不是subparser),那么argparse会期望cmd2参数将跟随任何subparsers参数.
有没有一种简单的方法来实现这一目标argparse?用例应该很常见......
以下是我到目前为止所尝试的更接近我需要的内容:
parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(help='Functions')
parser_1 = subparsers.add_parser('cmd1', help='...')
parser_1.add_argument('cmd1_option1', type=str, help='...')
parser_2 = subparsers.add_parser(cmd2, help='...')
parser_3 = subparsers.add_parser('cmd3', help='...')
parser_3.add_argument('cmd3_options', type=int, help='...')
args = parser.parse_args()
Run Code Online (Sandbox Code Playgroud) 我有一个 Git 命令别名来从存储库中查看最新标签:
~/.gitconfig:
checkout-latest = !git checkout $(git describe --tags `git rev-list --tags --max-count=1`)
Run Code Online (Sandbox Code Playgroud)
所以我可以在正确标记的存储库中使用它,如下所示:
$ git checkout-latest
Run Code Online (Sandbox Code Playgroud)
我有 checkout 命令的命令别名:
~/.gitconfig:
co = checkout
Run Code Online (Sandbox Code Playgroud)
不适checkout-latest用于结帐命令别名:
$ git co-latest
git: 'co-latest' is not a git command. See 'git --help'.
Run Code Online (Sandbox Code Playgroud)
如何配置 Git,以便可以使用latest 作为指向以编程方式确定的最新标签的标签别名?我想这样使用它:
$ git checkout latest
Run Code Online (Sandbox Code Playgroud)
和
$ git co latest
Run Code Online (Sandbox Code Playgroud)
请注意,在我想要的变体中,子命令和标签之间没有破折号。
是否可以为bash脚本实现子命令.我有这样的想法:
http://docs.python.org/dev/library/argparse.html#sub-commands
我有一个带有子命令的命令。在我的应用程序中,我希望用户强制指定子命令。我该怎么做?
我想从与当前目录不同的目录中移动文件。这是我想到的解决方案:
mv (cd ~/Downloads; ls -t | head -1 | xargs -I {} readlink -f {}) ./
可能有更好的方法,但一路上我发现我对子命令中目录更改的期望是错误的:运行 cd 会更改正在mv执行的目录。
那么,有没有办法只改变当前子命令的目录,而不影响top命令呢?
subcommand ×11
python ×6
argparse ×5
parsing ×2
picocli ×2
shell ×2
aliases ×1
bash ×1
command-line ×1
fish ×1
git ×1
java ×1
subparsers ×1