问题标签 [subparsers]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2976 浏览

python-2.7 - 使用该文件中另一个文件中的函数的 Argparse

我有两节课:

存储在单独的文件中(option_parser.py 和 application.py)。前者定义了如何处理命令行输入。后者导入前者,读取用户输入,并进行请求。

如何调用在 application.py 的 Application 中定义的方法而不将其导入 option_parser.py 中(因为这会导致无限循环,因为 application.py 从 option_parser.py 导入 OptionParser)。如果我使用set_defaults(func=method_name),那么我被告知全局函数method_name未在该范围内定义。

我已经有一个解决方法,但它似乎并不正确:

我试图在官方文档、谷歌和 SO 上找到答案 - 无济于事。

0 投票
2 回答
2915 浏览

python - 如何从父解析器获取 argparse 子解析器(检查默认值)

假设我创建了一个带有参数默认值的解析器,然后给它一个带有参数默认值的子解析器。

这一切都很好。但是假设我有一个parser从上面创建并返回父解析器的函数,但不能直接访问子解析器。

我怎样才能打印出子解析器参数的默认值?或者分别获取每个子解析器的句柄?

似乎没有更多的属性或方法parser._subparsers可以parser显示默认值。

总体问题是:当您只有父解析器的句柄时,如何以编程方式访问子解析器默认值?

0 投票
1 回答
143 浏览

python - 使用 argparse subparser 显示命令子组

我目前正在用 Python 开发一个包含约 40 个子命令的程序。解析器使用 argparse 完成。随着子命令数量的增加,搜索感兴趣的命令变得越来越复杂。目前,它显示如下。

我想更改显示以显示类别(例如更新/插入/选择)和相关的子命令。

是否有任何解决方案可用于 argparser 来实现此类 CLI?

谢谢

0 投票
0 回答
189 浏览

python-2.7 - 为什么我的整个命令行程序都需要特定于一个子命令的参数才能运行?

我正在使用 argparse 模块构建一个命令行程序,并且一直在尝试设计两个独立的、互斥的参数组来执行完全不同的任务。我决定通过创建子解析器来单独使用两组参数,并且我尝试遵循以下链接(https://pymotw.com/2/argparse/)中指定的格式以及众多stackoverflow线程,但是每当我尝试使用终端中的一个子解析器运行脚本时,总是会产生属性错误。

我的代码是按以下方式设置的(注意:为简洁起见,我对原始代码进行了一些精简和简化):

现在,如果我尝试使用例如以下命令在终端中运行此代码,则会收到以下错误:

如何运行我的命令行程序,以便一次只能运行一个子解析器(及其所需的参数)?

更新

找到这个来源(https://allthingstechilike.blogspot.co.uk/2013/07/python-argparse-example-using-subparser.html)后,我决定dest= 'mode'在哪里设置A_or_B_subparsers = parser.add_subparsers(help="A processes a certain input blah blah blah blah"),这取决于子命令是否在命令行中调用了 A 或 B,只有每个子命令所需的参数必须输入到命令行中。

随后,我在该行之后修改了我的条件树,args= MyProg.parse_args()如下所示:

但是,这种修改似乎并没有解决问题。尽管子命令 A 可以正常运行,但子命令 B 根本拒绝运行。有谁知道这是因为我的代码是如何设置的还是因为另一个内部问题?

0 投票
1 回答
1901 浏览

python - Python argparse 覆盖来自父级的帮助

我正在构建一个 CLI,它利用子解析器来处理类似于 git 之类的工具的子命令。我的一些子命令共享通用选项,因此我有一个定义选项的组解析器,每个需要它们的子命令都parents=group_parser用作参数之一。例如:

如您所见, command1 和 command2 都继承了 option --foo。我要做的是分别在 command1 和 command2 上更新 foo 的帮助文本。例如,如果我跑步myprog command1 -h,我希望它--foo在我跑步时说出不同的帮助信息myprog command2 -h。问题是直到我这样做之前parse_args()没有为该参数更新的命名空间,所以这样的事情不起作用:

这是否可以以某种方式向函数外部的参数添加额外的参数add_argument()?唯一的其他解决方案是不使用继承的父级,只为每个子命令单独定义 foo ,但如果有更新参数的方法,那将是理想的。

0 投票
2 回答
5401 浏览

python-2.7 - 如何在 Python 2.7 中使用 Argparse 模块设置默认子解析器

我正在使用 Python 2.7,并且正在尝试使用 argparse 完成类似 shell 的行为。我的问题,一般来说,我似乎无法在 Python 2.7 中找到一种方法来使用 argparse 的子解析器作为可选。解释我的问题有点困难,所以我将描述我对程序的要求。

该程序有 2 种工作模式:

  1. 使用给定命令启动程序(每个命令都有自己的附加参数),附加参数将运行特定任务。
  2. 在没有命令的情况下启动程序将启动一个类似于 shell 的程序,该程序可以接受一行参数并处理它们,就像使用给定行作为参数调用程序一样。

因此,例如,如果我的程序支持“cmd1”和“cmd2”命令,我可以像这样使用它:

  • python program.py cmd1 additional_args1
  • python program.py cmd2 additional_args2

或使用外壳模式:

  • python program.py
    • cmd1 additional_args1
    • cmd2 additional_args2
    • quit

此外,我还希望我的程序能够采用将影响所有命令的可选全局参数。

为此,我像这样使用 argparse(这是一个纯示例):

所以我可以调用 cmd1 (没有额外的参数)或 cmd2 (有或没有 -o 标志)。对于两者,我都可以添加标志 -i 以显示被调用命令的更多信息。

我的问题是我无法激活 shell 模式,因为我必须提供 cmd1 或 cmd2 作为参数(因为使用了必需的子解析器)

限制:

  • 我不能使用 Python 3(我知道在那里很容易做到)
  • 由于全局可选参数,我无法检查是否没有参数来跳过 arg 解析。
  • 我不想添加一个新命令来调用 shell,它必须是在根本不提供命令时

那么如何使用 argparse 和 python 2.7 实现这种行为呢?

0 投票
1 回答
940 浏览

python - 如何向 argpare 解析器添加更多子解析器?

如果我的代码调用的函数返回一个ArgumentParser已经定义了一些子解析器的函数,我该如何添加更多的子解析器?

我想做这样的事情:

但是当我在解释器中尝试这样做时:

请注意,我无权访问该build_parser()函数的内部。

我能想到的唯一解决方案是使用parents,但这具有以一种奇怪的方式对子解析器进行分组的副作用:

我想这样做的原因是我想向Argument Parser我继承的一个添加额外的“命令”。

0 投票
2 回答
1903 浏览

python - argparse 未正确处理子解析器中的缩写

(在python 3.6.0上运行)

TL;博士

为什么subparser即使使用 ,缩写也无效allow_abbrev=True


长版

argparse基本上,在接受缩写subparsers名称/别名时遇到问题。

这是代码:

因此,从上面的代码中,应该预期应该接受以下任何内容:

所以问题来了:

这有效:$ python prog.py c 123O

这给出了一个错误:$ python prog.py caes 123X

现在这是令人困惑的部分。

根据argparse 文档

ArgumentParser 支持使用 add_subparsers() 方法创建此类子命令。add_subparsers() 方法通常不带参数调用,并返回一个特殊的操作对象。这个对象有一个方法add_parser(),它接受一个命令名称和任何 ArgumentParser 构造函数参数,并返回一个可以像往常一样修改的 ArgumentParser 对象。

  1. 好的,所以任何人object created with add_subparser()都可以创建自己ArgumentParser objectobject.add_parser()权利吗?

  2. ...这意味着这个新创建的ArgumentParser对象应该能够接受任何ArgumentParser参数是吗?

ArgumentParser定义:

创建一个新的ArgumentParser对象。所有参数都应作为关键字参数传递。每个参数在下面都有自己更详细的描述,但简而言之,它们是:

allow_abbrev- 如果缩写明确,则允许缩写长选项。

(默认:

在 3.5 版更改:添加了 allow_abbrev 参数。

(这是在 python 3.6.0 上)


提前谢谢各位

0 投票
1 回答
100 浏览

python - 如何在 Python 中为 [-A[-b value]] 执行 argparse 子解析

我想重新创建 [-A [-b value]],其中命令如下所示:

测试.py -A -b 123

看起来很简单,但我做不到。我最近的尝试是:

0 投票
0 回答
96 浏览

command-line - 使用 argparse 将大型程序划分为子命令

我想使用六个子命令(使用 argparse 库中的子解析器)将我的大程序分成更小的独立程序,并能够单独运行它们。换句话说,我设想一个接一个地从命令行运行六个命令,其中每个命令的结果作为下一个命令的参数输入。(或者如果使用 argparse 无法做到这一点,那么至少可以通过某种方式独立运行这六个部分中的每一个)。

我对一个解析器没有任何问题,但是当我试图了解如何使用子解析器来完成这项任务时,我发现文档太混乱了。

目前我的代码类似于

所以我想要的行为是在命令行上我可以输入

因此,如果一个子命令出现问题,我可以独立运行该子命令进行调试。

任何帮助理解我应该做什么的逻辑将不胜感激。我什至不确定我想要的行为是否是我应该想要的行为。