在多个自定义模块支持的多个脚本中使用 python 的 argparse

2024-04-21

我正在构建一组用于管理我们的基础设施的脚本和模块。为了让事情井井有条,我想整合尽可能多的努力,并尽量减少新脚本的样板代码。

特别是这里的问题是整合 ArgumentParser 模块。

一个示例结构是让脚本和库组织如下:

|-- bin
    |-- script1
    |-- script2
|-- lib
    |-- logger
    |-- lib1
    |-- lib2

在这种情况下script1只能利用logger and lib1, while script2会利用logger and lib2。在这两种情况下,我希望记录器接受“-v”和“-d”,而script1也可以接受额外的参数和lib2其他参数。我知道这可能会导致冲突,并将手动管理。

script1

#!/usr/bin/env python
import logger
import lib1
argp = argparse.ArgumentParser("logger", parent=[logger.argp])

script2

#!/usr/bin/env python
import logger
import lib2

logger

#!/usr/bin/env python
import argparse
argp = argparse.ArgumentParser("logger")
argp.add_argument('-v', '--verbose', action="store_true", help="Verbose output")
argp.add_argument('-d', '--debug', action="store_true", help="Debug output. Assumes verbose output.")

每个脚本和库都可能有自己的参数,但是这些都必须合并到一个最终的 arg_parse() 中

到目前为止,我的尝试导致未能继承/扩展 argp 设置。如何在库文件和脚本之间完成此操作?


最简单的方法是在每个模块中都有一个接受ArgumentParser实例并向其添加自己的参数。

# logger.py
def add_arguments(parser):
    parser.add_argument('-v', '--verbose', action="store_true", help="Verbose output")
    # ...

# lib1.py
def add_arguments(parser):
    parser.add_argument('-x', '--xtreme', action="store_true", help="Extremify")
    # ...

每个脚本都会创建自己的ArgumentParser,将其传递给每个提供参数的模块,然后添加自己的特定参数。

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

在多个自定义模块支持的多个脚本中使用 python 的 argparse 的相关文章

随机推荐

  • 如何让 Celery 工作人员返回任务结果

    我有一个调用任务的烧瓶应用程序 该任务从数据库中提取数据 绘制折线图并返回在 html 页面上呈现的 html 内容 如果没有 Celery Flask 应用程序可以正常工作并在客户端呈现折线图 但现在我想委托 celery 通过以下方式运
  • CDN 不工作时如何加载本地文件

    我正在使用一些 CDN js 和 css 文件 我在Google上搜索了如果CDN不工作如何加载本地数据 我发现一个很好的链接是这样写的
  • 仅加载 html5 视频/音频的元数据

    首先 我想问这个问题 如果没有任何其他视频内容 我无法加载元数据 preload metadata 不管用 我在 Win Chrome 上测试 不知道它在 Safari FF IE Opera 上如何工作 因此我无法快速加载六个或更多视频剪
  • 事件处理程序返回未定义?

    假设我将 jQuery 单击事件的事件处理程序附加到我的对象的函数之一 但为什么它在我的属性上返回未定义 var buttonView label underscore onClick function alert clicked this
  • 将 SharePoint 用户写入 SharePoint 列表中的用户字段的正确方法

    我正在将用户写入 SharePoint 列表 我读到 SharePoint 用户字段内部有一个类似这样的字符串 userId userLoginName 在写入用户字段时 我尝试以相同的方式进行格式化 例如 当我写入此字符串时 它会起作用
  • 将多个 Word 文档合并为一个 Open Xml

    我有大约 10 个 word 文档 它们是使用 open xml 和其他东西生成的 现在我想创建另一个word文档 我想将它们逐一加入到这个新创建的文档中 我希望使用 open xml 任何提示都会很有意义 下面是我的代码 private
  • npm start 如何在端口 8000 上运行服务器

    我最近使用 github 上的 Angular Seed 文件夹进行 Angular 应用程序开发 在之前的一些 AngularJS 教程中 Angular Seed 文件夹中有一个脚本文件夹和一个 server js 文件 其中包含运行节
  • 是否可以将 UIView 的顶部固定到导航栏的底部?

    我试图将 UIView 定位在导航栏下方 20pt 但是当我相对于视图控制器上的视图设置它时 它仍然位于导航栏下方 20pt 并且我不想对其进行硬编码 是否可以将其放置在远离导航栏的位置 要以编程方式执行此操作 请使用topLayoutGu
  • Powershell 以块的形式读取文件

    我有一个用 Powershell 编写的脚本 它通过 FTP 传输文件 使用以下命令可以正常工作 content System IO File ReadAllBytes backup app data 但是 一旦文件大小达到 2Gb 此方法
  • 标题正确,但 Chrome 显示“资源解释为文档”

    我读了很多这样的问题 但我真的无法弄清楚 我用archiver https www npmjs com package archiver and express https www npmjs com package expressNode
  • 如果电子邮件/密码输入错误,无法显示错误消息

    如果电子邮件 密码输入错误 我希望出现一个消息框 我正在使用 else 语句 但如果登录不正确 它不会显示消息 MyConn New OleDbConnection MyConn ConnectionString connString My
  • 删除 ThreadPoolExecutor 的所有排队任务

    我有一个相当简单的问题线程池执行器 http java sun com javase 6 docs api java util concurrent ThreadPoolExecutor html 我遇到以下情况 我必须使用队列中的对象 为
  • DynamoDB:键及其含义

    我对如何使用 DynamoDB 表键感到困惑 该文档提到了 HASH 似乎也称为分区 键和 RANGE 或排序 键 我试图将这些与我之前对数据库索引理论的理解大致保持一致 我目前主要基于猜测的理解是 HASH 键本质上是主键 它必须是唯一的
  • Spring 部分更新对象数据绑定

    我们正在尝试在 Spring 3 2 中实现一个特殊的部分更新功能 我们使用 Spring 作为后端 并有一个简单的 Javascript 前端 我无法找到满足我们要求的直接解决方案 即update 函数应该接受任意数量的 field va
  • 我可以在乳胶文档的标题中使用 knitr 内联表达式吗?

    我想使用 Knit Sweave 内联调用 Sexpr 在 LaTeX 文档的标题中 在 begin document 命令之后但在 maketitle 命令之前 内联 R 代码将从我嵌入 LaTeX 的 R 脚本早期创建的 R 数据帧中提
  • sqlite只支持1笔交易?

    在使用 ADO NET 时 也许我错了 我不知道它叫什么 我注意到我只能通过连接开始事务 并且命令似乎有 command Transaction 获取事务数据但不启动事务本身 实际上 在查看时我在 System Data SQLite 中看
  • typeid 运算符的奇怪行为?

    使用 XCode 3 2 3 64 位 我得到以下奇怪的输出 我究竟做错了什么 include
  • Willpopscope 无法在 Web 上拦截浏览器后退按钮

    我尝试过拦截网络上的后退按钮 但它不会被触发 我怎样才能让它发挥作用 WillPopScope onWillPop print will pop on web Get offNamed orders return new Future gt
  • grunt-wiredep 对具有不同依赖关系的多个文件

    目前的项目结构有点像这样 index html bower json bower components 建议的项目结构将在项目根目录中添加更多静态 html 文件 到目前为止 我一直在管理 Bower json 中的所有前端依赖项 并使用
  • 在多个自定义模块支持的多个脚本中使用 python 的 argparse

    我正在构建一组用于管理我们的基础设施的脚本和模块 为了让事情井井有条 我想整合尽可能多的努力 并尽量减少新脚本的样板代码 特别是这里的问题是整合 ArgumentParser 模块 一个示例结构是让脚本和库组织如下 bin script1