argparse 和互斥组,每个组都有自己所需的设置

2024-01-10

我有一个程序需要有一个选项来测试服务器 ID 列表OR对服务器发出命令。这意味着,如果我发出--test,那么不需要其他任何东西。它对每台服务器运行全部测试并打印结果。

但是,如果我不指定--test,那么它应该需要一些选项,例如--id and --command.

但是,我不确定argparse可以处理互斥组中所需的选项。代码(为简单起见进行了修改)如下。我已经修改了选项,所以如果您指定-a,那么你应该可以开始了,不需要其他选择。

import argparse

parser = argparse.ArgumentParser()

test_or_not = parser.add_mutually_exclusive_group(required=True)
test_or_not.add_argument('-a', action='store_true')
or_not = test_or_not.add_argument_group()
target = or_not.add_mutually_exclusive_group(required=True)
target.add_argument('-b',action="store_true")
target.add_argument('-c',action="store_true")
target.add_argument('-d',action="store_true")
target.add_argument('-e',action="store_true")
group = or_not.add_mutually_exclusive_group(required=True)
group.add_argument('-f',action="store_true")
group.add_argument('-g',action="store_true")
or_not.add_argument('-i',action="store_true")
or_not.add_argument('-j',action="store_true")
or_not.add_argument('-k',action="store_true")
or_not.add_argument('-l',action="store_true")

args = parser.parse_args()

产生错误的原因是argparse仍然需要单独的选项,即使它们位于相互排斥的组中。有没有办法argparse可以容纳这组选项还是我需要在之外添加一些编程argparse?

$ python3 ~/tmp/groups.py -a
usage: groups.py [-h] -a (-b | -c | -d | -e) (-f | -g) [-i] [-j] [-k] [-l]
groups.py: error: one of the arguments -b -c -d -e is required

编辑:我可以添加一个完全在外部工作的新选项argparse如下,但我想保持它的结构argparse如果可能的话。

import argparse
import sys

if '--test' in sys.argv:
    go_do_testing()
    sys.exit(0)

parser = argparse.ArgumentParser()
<snip>

正如评论中所建议的,如果您希望相互排斥,该怎么走test and run逻辑,将使用子解析器。下面是这个想法的一个例子:

#!/usr/bin/env python3
"""
Script to test or run commands on given servers.
./the_script.py test  # To test all servers
./the_script.py run --id 127.0.0.1 --command "echo hello world"
"""
from argparse import ArgumentParser, RawDescriptionHelpFormatter as RDHF


def test_servers(servers):
    """
    Given a list of servers, let's test them!
    """
    for server in servers:
        print('Just tested server {s}'.format(s=server))

def do_actual_work(server_id, command):
    """
    Given a server ID and a command, let's run the command on that server!
    """
    print('Connected to server {s}'.format(s=server_id))
    print('Ran command {c} successfully'.format(c=command))


if __name__ == '__main__':
    parser = ArgumentParser(description=__doc__, formatter_class=RDHF)
    subs = parser.add_subparsers()
    subs.required = True
    subs.dest = 'run or test'
    test_parser = subs.add_parser('test', help='Test all servers')
    test_parser.set_defaults(func=test_servers)
    run_parser = subs.add_parser('run', help='Run a command on the given server')
    run_parser.add_argument('-i', '--id',
                            help='The ID of the server to connect to and run commands',
                            required=True)
    run_parser.add_argument('-c', '--command',
                            help='The command to run',
                            required=True)
    run_parser.set_defaults(func=do_actual_work)
    args = parser.parse_args()
    
    if args.func.__name__ == 'test_servers':
        all_servers = ['127.0.0.1', '127.0.0.2']
        test_servers(all_servers)
    else:
        do_actual_work(args.id, args.command)

该脚本设置了互斥和必需的子解析器test and run。为了test子解析器,不需要其他任何东西。然而,对于run子解析器,两者--id and --command将被要求。每个子解析器都与其指定的目标函数相关联。为了简单起见,我有test_parsertest_servers; while run_parser与....关联do_actual_work.

此外,您应该能够按如下方式调用脚本来运行所有测试:

./the_script.py test

要在特定服务器上运行特定命令,请按如下方式调用脚本:

./the_script.py run --id 127 --command "echo hello world"

我希望这有用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

argparse 和互斥组,每个组都有自己所需的设置 的相关文章

随机推荐

  • 将值从 HTML 传递到 CSS

    我感兴趣是否可以将值从 html 传递给 css 类 像这样 例子 div class Some text div style mt mpx margin top mpx px 我听说这种方式在 Less 中是可能的 不 你想要的方式在 C
  • ConnectivityManager 在获取网络信息时崩溃

    我是 Android 新手 当我给出以下代码片段时 我的 Android 应用程序崩溃了 ConnectivityManager manager ConnectivityManager this getSystemService Conte
  • 如何在 Nexmo 中向美国号码发送文本

    向菲律宾发送信息非常简单 但在美国的数字中 我必须进行验证 但我不知道如何进行 我开始了2F认证 但似乎我不知道下一步该怎么做 我的问题 如何在 Nexmo 中添加发送文本到美国号码 对于美国 您必须从您的 nexmo 帐户创建一个短代码
  • 来自本地 json 变量的 d3 饼图

    我正在尝试使用我见过的局部变量 而不是外部文件 中的 json 创建一个圆环图这个帖子 https stackoverflow com questions 10934853 d3 js loading json without a http
  • 由于格式不正确,加载程序集失败

    我开发了一个相当大的 Windows Forms net C 应用程序 其中包含多个程序集 最初 每个程序集都是为目标平台 任何 CPU 构建的 由于 x64 机器上的 Crystal Reports 存在问题 我们必须为 x86 目标平台
  • 如何在react-quill中注册对齐样式

    我在用着反应鹅毛笔 https www npmjs com package react quillnpm 包并在 nextjs 中动态导入它 我还使用 create next app 样板 我能够让反应鹅毛笔编辑器工作 但是 我无法获取使用
  • 地理编码器 Gem 无法在生产环境中工作

    所以我正在使用Geocoder https github com alexreisner geocoder根据用户提交表单时提供的地址提取纬度和经度坐标 我这样做是为了使用 Google 地图 API 绘制标记 这在开发中非常有效 零问题
  • .NET 4.5 中是否已弃用 ObjectContext?

    我一直在使用ObjectContexts已经很长一段时间了 现在我已经安装了 VS 2012 令我惊讶的是 实体数据模型没有创建代码生成项的选项ObjectContexts and EntityObjects代替DbContexts and
  • Mongoose 在 Node.js 中创建多租户支持连接

    我正在研究一种使用 node js mongoose 和 mongodb 实现多数据库以支持多租户的好方法 我发现 mongoose 支持一种名为createConnection 我想知道使用它的最佳实践 实际上 我将所有这些连接存储在一个
  • 基于智能指针的 CRTP 习惯用法的编译问题

    我正在尝试为 CRTP 示例编译一个最小的工作示例这篇博文 https www fluentcpp com 2017 09 12 how to return a smart pointer and use covariance 它基于智能指
  • 如何将一些“统计数据”从 C# 程序传递到另一个程序?

    我有一个命令行程序 可以 做很多工作 并产生 很多统计数据 它是股票交易软件 对于延迟 错误等非常重要 所以我不想向其中添加 GUI 此外 有时需要 GUI 但控制台应用程序应始终启动 我需要 GUI 来友好地显示收集的统计信息 以只读模式
  • 降低无向图的时间复杂度

    我有一个无向图 表示 Facebook 等社交媒体中的用户连接 有N个节点 从1到N 边由数组 from 和 to 表示 任务数组表示我有兴趣查找该节点 即社交媒体中的用户 的连接的节点号 Example N 5 From 2 2 1 1
  • ASP.NET Core 中 HttpContext 如何响应 END

    我想使用mvcSystem Web HttpContext Current Response End 但尝试使用以下代码在 mvc core 2 中 private readonly IHttpContextAccessor httpCon
  • 如何找出哪个视图是焦点?

    我需要查明活动中是否有任何视图聚焦以及它是什么视图 这个怎么做 Call getCurrentFocus http developer android com reference android app Activity html getC
  • 如何用 sed 替换整行?

    假设我有一个包含行的文件 aaa bbb 现在我想将它们替换为 aaa xxx 我可以这样做 sed s aaa bbb aaa xxx g 现在我有一个包含几行的文件 如下所示 aaa bbb aaa ccc aaa ddd aaa so
  • Microsoft Azure Bot Framework 模拟器未发送消息

    在我的 Windows 10 上 我安装了Microsoft Azure Bot 框架模拟器 https learn microsoft com en us azure bot service bot service debug emula
  • 获取具有特定 fieldName 的所有 lucene 值

    解决this https stackoverflow com questions 618227 faster way to get distinct values from lucene query问题 我创建了一个新的 Lucene 索引
  • 如何从远程文件(Java)获取修改日期?

    我有一个从远程 URL 下载文件的功能 使用 Java 现在我想知道真正的修改日期 因为当我下载它时我丢失了此信息 提前致谢 public void downloadFile String remoteFile String localFi
  • setColorFilter 有时在 Android 可绘制对象上不起作用

    我正在尝试根据用户在偏好中选择的原色在可绘制对象上应用滤色器 这是我正在使用的一段代码 getResources getDrawable R drawable ic batman 1 setColorFilter ColorHelper g
  • argparse 和互斥组,每个组都有自己所需的设置

    我有一个程序需要有一个选项来测试服务器 ID 列表OR对服务器发出命令 这意味着 如果我发出 test 那么不需要其他任何东西 它对每台服务器运行全部测试并打印结果 但是 如果我不指定 test 那么它应该需要一些选项 例如 id and