- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在将 Bash shell 安装程序实用程序转换为 Python 2.7,并且需要实现复杂的 CLI,以便我能够解析数十个参数(可能多达 ~150 个)。这些是 Puppet 类变量的名称,此外还有十几个通用部署选项,这些选项在 shell 版本中可用。
然而,在我开始添加更多变量后,我面临着几个挑战:1. 我需要将参数分组到单独的字典中,以便将部署选项与 Puppet 变量分开。如果它们被扔到同一个桶中,那么我将不得不编写一些逻辑来对它们进行排序,可能会重命名参数,然后字典合并将不是微不足道的。2. 可能存在同名但属于不同 Puppet 类的变量,所以我认为子命令可以让我过滤什么去哪里并避免名称冲突。
目前我已经通过简单地添加多个解析器实现了参数解析:
parser = argparse.ArgumentParser(description='deployment parameters.')
env_select = parser.add_argument_group(None, 'Environment selection')
env_select.add_argument('-c', '--client_id', help='Client name to use.')
env_select.add_argument('-e', '--environment', help='Environment name to use.')
setup_type = parser.add_argument_group(None, 'What kind of setup should be done:')
setup_type.add_argument('-i', '--install', choices=ANSWERS, metavar='', action=StoreBool, help='Yy/Nn Do normal install and configuration')
# MORE setup options
...
args, unk = parser.parse_known_args()
config['deploy_cfg'].update(args.__dict__)
pup_class1_parser = argparse.ArgumentParser(description=None)
pup_class1 = pup_class1_parser.add_argument_group(None, 'Puppet variables')
pup_class1.add_argument('--ad_domain', help='AD/LDAP domain name.')
pup_class1.add_argument('--ad_host', help='AD/LDAP server name.')
# Rest of the parameters
args, unk = pup_class1_parser.parse_known_args()
config['pup_class1'] = dict({})
config['pup_class1'].update(args.__dict__)
# Same for class2, class3 and so on.
此方法无法解决问题 2 的问题。此外,第一个解析器使用“-h”选项,其余参数未在帮助中显示。
我试过使用example selected as an answer但我无法同时使用这两个命令。
## This function takes the 'extra' attribute from global namespace and re-parses it to create separate namespaces for all other chained commands.
def parse_extra (parser, namespace):
namespaces = []
extra = namespace.extra
while extra:
n = parser.parse_args(extra)
extra = n.extra
namespaces.append(n)
return namespaces
pp = pprint.PrettyPrinter(indent=4)
argparser=argparse.ArgumentParser()
subparsers = argparser.add_subparsers(help='sub-command help', dest='subparser_name')
parser_a = subparsers.add_parser('command_a', help = "command_a help")
## Setup options for parser_a
parser_a.add_argument('--opt_a1', help='option a1')
parser_a.add_argument('--opt_a2', help='option a2')
parser_b = subparsers.add_parser('command_b', help = "command_b help")
## Setup options for parser_a
parser_b.add_argument('--opt_b1', help='option b1')
parser_b.add_argument('--opt_b2', help='option b2')
## Add nargs="*" for zero or more other commands
argparser.add_argument('extra', nargs = "*", help = 'Other commands')
namespace = argparser.parse_args()
pp.pprint(namespace)
extra_namespaces = parse_extra( argparser, namespace )
pp.pprint(extra_namespaces)
结果我:
$ python argtest.py command_b --opt_b1 b1 --opt_b2 b2 command_a --opt_a1 a1
usage: argtest.py [-h] {command_a,command_b} ... [extra [extra ...]]
argtest.py: error: unrecognized arguments: command_a --opt_a1 a1
当我尝试用两个子解析器定义父级时,结果相同。
问题
parse_known_args(namespace=argument_group)
传递(如果我没记错的话)会获取所有变量(没关系),但也会在结果字典中获取所有 Python 对象内容(这对 hieradata YAML 不利)注意:我是系统管理员,不是程序员,所以请对我的非对象风格编码轻描淡写。 :)
谢谢
已解决通过 hpaulj 建议的答案解决参数分组.
import argparse
import pprint
parser = argparse.ArgumentParser()
group_list = ['group1', 'group2']
group1 = parser.add_argument_group('group1')
group1.add_argument('--test11', help="test11")
group1.add_argument('--test12', help="test12")
group2 = parser.add_argument_group('group2')
group2.add_argument('--test21', help="test21")
group2.add_argument('--test22', help="test22")
args = parser.parse_args()
pp = pprint.PrettyPrinter(indent=4)
d = dict({})
for group in parser._action_groups:
if group.title in group_list:
d[group.title]={a.dest:getattr(args,a.dest,None) for a in group._group_actions}
print "Parsed arguments"
pp.pprint(d)
这让我得到了第 1 期的预期结果。直到我将有多个同名参数。解决方案可能看起来很丑陋,但至少它按预期工作。
python argtest4.py --test22 aa --test11 yy11 --test21 aaa21
Parsed arguments
{ 'group1': { 'test11': 'yy11', 'test12': None},
'group2': { 'test21': 'aaa21', 'test22': 'aa'}}
最佳答案
您的问题过于复杂,无法一次理解和回答。但我会抛出一些初步的想法。
是的,argument_groups
只是帮助中参数分组的一种方式。它们对解析没有影响。
另一个最近的 SO 询问了关于解析参数组的问题:
Is it possible to only parse one argument group's parameters with argparse?
该发帖人最初想使用组作为解析器,但 argparse
类结构不允许这样做。 argparse
以对象样式编写。 parser=ArguementParser...
创建一类对象,parser.add_arguement...
创建另一类,add_argument_group...
又一类。您可以通过子类化 ArgumentParser
或 HelpFormatter
或 Action
类等来自定义它。
我提到了一个parents
机制。您定义一个或多个父解析器,并使用它们来填充您的“主”解析器。它们可以独立运行(使用 parse_known_args),而“main”用于处理帮助。
我们还讨论了在解析后对参数进行分组。 namespace
是一个简单的对象,其中每个参数都是一个属性。它还可以转换为字典。从字典中提取项目组很容易。
关于使用多个子解析器有很多问题。这是一个尴尬的提议。可能,但并不容易。子解析器就像向系统程序发出命令。您通常每次调用发出一个命令。您不嵌套它们或发出序列。您让 shell 管道和脚本处理多个操作。
IPython
使用 argparse
来解析它的输入。它首先捕获帮助,然后发出自己的消息。大多数参数来自配置文件,因此可以使用默认配置、自定义配置和命令行设置值。这是命名大量参数的示例。
子解析器允许您使用相同的参数名称,但不能在一次调用中调用多个子解析器,这没有多大帮助。即使您可以调用多个子解析器,它们仍会将参数放在同一个 namespace 中。此外,argparse
尝试以独立于顺序的方式处理标记的参数。因此,命令行末尾的 --foo
会像在开始时一样被解析。
在我们讨论使用参数名称('dest')如 'group1.argument1'
时,我什至讨论了使用嵌套命名空间的问题。如果有帮助,我可以查一下。
另一个想法 - 加载 sys.argv
并在将其传递给一个或多个解析器之前对其进行分区。您可以将其拆分为某个关键字或前缀等。
关于python - 同时解析 python 中的多个子命令或以其他方式对解析的参数进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31559910/
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
我有一系列 SQL 命令,我想在大约 40 个不同的表上运行。必须有一种方法可以在不编写 40 条不同命令的情况下执行此操作... 我在 SQL Server 中运行它。所有表都有不同的名称,我要操作
我习惯在 PHP 中使用命令“mysql_insert_id()”来返回插入到我的数据库中的最后一行的 id。 在 C# 中的 SQLite 中是否有等效的命令? 谢谢! -阿德娜 最佳答案 选择 l
试图找出一种方法来回填 ds 分区 Hive 表的分区。 我知道如何从 CLI 运行 Hive 命令,例如 $HIVE_HOME/bin/hive -e 'select a.col from tab1
我有 .bat 文件。看起来像下一个 ....many commands1 ftp -i -s:copy.txt ...many commands2 copy.txt 包含下一个命令 open ...
基本上我想输入 show 并检查是否有 show 命令或别名已定义并触发它,如果未定义则触发 git show 。 例如 rm 应该执行 rm 但 checkout 应该执行 git checkout
我公司的主数据库是 iSeries 机器,我已经非常习惯使用 DB2 命令和结构。我现在正在尝试做一个小项目,更新一个包含超过 300 万条记录的表。我想出一种比较和“清理”数据的更快方法是使用 My
我想在带有 Node 的终端中制作一个简单的按钮板,并“blessed”用于连接或运行不同的命令。 ----------------------------------------------- _
我们有一个 selenium IDE 脚本,正在转换为 python webdriver。以下命令未转换: [openWindow | http://mywebsite.com/index.php |
我正在学习这个关于从 GIT HUB 下载和安装 Web 文件的在线教程。我进入主题:启动我们的静态网站,系统提示我输入命令以下载和安装 Web 文件。但是,当我输入命令 yarn install 时
我在 shell 脚本中使用 elif 命令时遇到问题,就像在 fortran 中一样。 我有 100 家公司的员工名单。我想屏蔽那些员工少于 500 人的公司。我的脚本是 rm -f categor
我有一些 Linux 命令可以生成 token 。我在 Linux 机器上使用操作系统库形式的 Python 自动化了这些命令。它工作正常。 但是,当我在 Windows 中尝试相同的代码时,它没有返
本文分享自华为云社区《Git你有可能不知道交互式暂存》,作者:龙哥手记。 本节中的几个交互式 Git 命令可以帮助你将文件的特定部分组合成提交。 当你在修改了大量文件后,希望这些改动能拆分为若干提交而
我想知道如何使用 IN 比较语法来做到这一点。 当前的 SQL 查询是: select * from employee where (employeeName = 'AJAY' and month(e
我在这个位置安装了 Hadoop /usr/local/hadoop$ 现在我想列出 dfs 中的文件。我使用的命令是: hduser@ubuntu:/usr/local/hadoop$ bin/ha
是否有一个单一的 docker 命令可用于清除所有内容?如果正在运行,请停止所有容器、删除所有图像、删除所有卷...等。 最佳答案 我认为没有一个命令可以做到这一点。您首先需要停止所有容器使用 $ d
我基本上是在 clojure/nrepl 模式中寻找与 C-u C-x C-e 或 C-c C-p 等效的 Scheme。 我想要一个 C-x C-e 将输出打印到缓冲区,而不是仅仅在 repl 中。
我可以在 vim 中使用 pudb(一个 ncurses Python 调试器),因为,例如,:!python %在实际的终端窗口中运行。我更喜欢使用 gvim,但 gvim 运行 :!python
我正在尝试编写一个 FFMPEG 命令: 取为 输入 一个视频 input.mp4 和一个图像 pic.jpg 作为 输出 将 input.mp4 拆分为 20 秒的视频,按顺序重命名;对于每个分割视
我想转储视频每帧的比特率。我正在尝试使用 -vstats 获取此信息命令。当我运行此命令时 - ffmpeg -i input.mp4 -vstats 它显示至少应该定义一个文件。 如果有人能建议我任
我是一名优秀的程序员,十分优秀!