Python 的 argparse 可以像 gnu getopt 一样排列参数顺序吗?

2024-01-10

GNU getopt 和使用它的命令行工具允许选项和参数交错,称为排列选项(请参阅http://www.gnu.org/software/libc/manual/html_node/Using-Getopt.html#Using-Getopt http://www.gnu.org/software/libc/manual/html_node/Using-Getopt.html#Using-Getopt)。 Perl 的 Getopt::Long 模块也支持此功能(使用 qw(:config gnu_getopt))。 argparse 似乎不支持(甚至不提及)排列选项。

有很多与 arg/opt 顺序相关的问题,但似乎没有人回答这个问题:Can argparse be made to permute argument order like getopt?

用例是一个典型的命令行签名,如 GNU sort:

sort [opts] [files]

其中 1) 选项和文件被排列,2) 文件列表可以包含零个或多个参数。

例如:

import argparse
p = argparse.ArgumentParser();
p.add_argument('files',nargs='*',default=['-']);
p.add_argument('-z',action='store_true')

p.parse_args(['-z','bar','foo']) # ok
p.parse_args(['bar','foo','-z']) # ok
p.parse_args(['bar','-z','foo']) # not okay
usage: ipython [-h] [-z] [files [files ...]]

我试过了:

  • p.parse_known_args - 不会抱怨,但实际上也不会排列,并且它不会犹豫看起来像无效选项的参数(例如上面的 --bogus 或 -b )。
  • p.add_argument('files',nargs=argparse.REMAINDER) -- 选项 -z 包含在文件中,除非在位置参数之前
  • p.add_argument('文件',nargs='*',action='附加');

我想实现一些类似于上面的 GNU 排序原型的东西。我对可以为每个文件指定的标志不感兴趣(例如,-f file1 -f file2)。


这是一个快速解决方案,一次解码一对参数列表(选项、位置参数)。

import argparse

class ExtendAction(argparse.Action):
    def __call__(self, parser, namespace, values, option_string=None):
        items = getattr(namespace, self.dest, None)
        if items is None:
            items = []
        items.extend(values)
        setattr(namespace, self.dest, items)

parser = argparse.ArgumentParser()
parser.add_argument('files', nargs='*', action=ExtendAction)
parser.add_argument('-z', action='store_true')
parser.add_argument('-v', action='count')
parser.add_argument('args_tail', nargs=argparse.REMAINDER)

def interleaved_parse(argv=None):
    opts = parser.parse_args(argv)
    optargs = opts.args_tail
    while optargs:
        opts = parser.parse_args(optargs, opts)
        optargs = opts.args_tail
    return opts

print(interleaved_parse('-z bar foo'.split()))
print(interleaved_parse('bar foo -z'.split()))
print(interleaved_parse('bar -z foo'.split()))
print(interleaved_parse('-v a -zv b -z c -vz d -v'.split()))

Output:

Namespace(args_tail=[], files=['bar', 'foo'], v=None, z=True)
Namespace(args_tail=[], files=['bar', 'foo'], v=None, z=True)
Namespace(args_tail=[], files=['bar', 'foo'], v=None, z=True)
Namespace(args_tail=[], files=['a', 'b', 'c', 'd'], v=4, z=True)

注意:不要尝试将其与其他非标志参数一起使用(除了单个nargs='*'论证和args_tail争论)。解析器不会知道以前的调用parse_args因此它将为这些非标志参数存储错误的值。作为解决方法,您可以解析nargs='*'使用后手动参数interleaved_parse.

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

Python 的 argparse 可以像 gnu getopt 一样排列参数顺序吗? 的相关文章

随机推荐

  • 如何使用数组包含元素创建 NSPredicate

    我只是有Address有财产的实体favourites类型的 String Address objc Address class Address NSManagedObject Observer NSManaged var favourit
  • 在反应中一次导入多个图像文件的任何简单方法

    我输入以下内容来导入图像 需要一个简短的方法来做到这一点 import banner1 from imgs Banners banner1 jpg import banner2 from imgs Banners banner2 jpg i
  • 通过提升业力重用已解析的变量

    我有一个与下面的代码相当的代码库 我尝试生成一个文本文件 其内容是变量的两倍 我觉得答案在于语义动作以及 a 和 val 但即使有文档也无法完成 您将如何做才能拥有 str 中的 toto 和输出 托托一些东西托托 即如何在业力中重用已解析
  • 检测设备是否正在充电

    我找不到任何明确的用途我最喜欢的工具 http www google com 不过我想我会把它放在这里 有没有办法使用 iPhone SDK 让应用程序检测设备是否处于通电状态 充电 底座等 如果设备正在通电 否则它是用户指定的设置 我希望
  • Rails 迁移变更列

    We have script generate migration add fieldname to tablename fieldname datatype用于向模型添加新列的语法 在同一行上 我们是否有一个脚本 生成来更改列的数据类型
  • timessince 过滤器的格式

    有没有办法使用 date timesince 过滤器 但不是有两个相邻的单元 而是只显示一个 例如 我的模板当前显示 18 小时 16 分钟 我怎样才能让它显示 18小时 这里不考虑四舍五入 谢谢 我想不出一个简单的内置方法来做到这一点 这
  • JavaScript 如何创建稀疏数组?

    虽然我不知道这个功能的名称 a a 57 test console log a length console log a 57 console log a 我很敬畏这是可能的 由于具有 C 背景 这种行为与分配内存之类的行为非常不同 那么几
  • Elasticsearch-Kibana docker-compose - 禁止使用“elastic”值

    我想使用 docker compose 运行 elasticsearch 和 kibana 这是我的 docker compose yml 我使用 docker compose env file dev env up 运行 Docker 组
  • 如何运行 NDK 示例?

    很抱歉问这样一个菜鸟问题 但是 NDK 文档是错误的 r7b 如果您使用 ADT 在 Eclipse 中进行开发 请使用新建项目向导 使用 导入 为每个示例创建一个新的 Android 项目 从现有源 选项并从以下位置导入源
  • 如何在 CMake 中检查列表是否包含特定条目?

    我想检查列表是否包含特定条目 如以下代码片段所示 macro foo if ARGN contains bar endif endmacro CMake 不提供contains 获得所需结果的最佳 最简单方法是什么 在CMake的wiki
  • 如何在 UWP 应用中隐藏/折叠标题栏?

    有没有办法以某种方式隐藏 折叠 使 UWP 应用程序中的标题栏暂时不可见 但不能完全禁用 我知道可以使应用程序全屏显示 然后标题栏自动折叠 但我需要在可调整大小的桌面窗口中实现它 我还知道您可以自定义标题栏的外观 例如颜色等 原因 我的应用
  • CMSIS & STM32,如何开始? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在 STM32 上使用 CMSIS 启动项目 网上一搜 没找到具体的教程 有些使用 SPL 开始项
  • 结构化流Kafka 2.1->Zeppelin 0.8->Spark 2.4:spark不使用jar

    我有一个 Kafka 2 1 消息代理 想要对 Spark 2 4 中的消息数据进行一些处理 我想使用 Zeppelin 0 8 1 笔记本进行快速原型设计 我下载了结构化流所需的spark streaming kafka 0 10 2 1
  • 使 Eclipse equals() / hashCode() 使用 getters

    是否可以使默认的 Eclipse 生成 hashCode 和 equals 使用 getters 而不是字段引用 IE 我可以获取它使用的模板吗 我正在使用 Hibernate 代理对象仅在使用 getter 时才 LazyLoaded 而
  • 如何在 PyQt 中获取按钮或标签(QPushButton、QLabel)的背景颜色

    我对 PyQt 还很陌生 有谁告诉我如何在 PyQt 中获取按钮或标签 QPushButton QLabel 的背景颜色 这是示例代码 这会对你有所帮助 QPushButton button1 button2 button1 setStyl
  • session_regenerate_id() - 已在单元测试 Yii 控制器中发送的标头

    我正在尝试对我的控制器 Yii 框架 进行单元测试 dataProvider provider public function testActionEdit view login controller user new CWebUser u
  • 替换嵌套 for 循环的宏

    我找到了这个宏 define TIMES x for int i1 0 i1
  • 无法读取配置节“system.web.extensions”,因为它缺少节声明

    我收到错误 配置部分system web extensions无法读取 因为它缺少节声明 在安装我的网络应用程序时服务器2008 32位机 with NET框架4 0 但它在 2008 r2 64 位机器上运行良好 这是我的网络配置文件信息
  • Android Wear 启动器

    我想知道 Android Wear 启动器 如 Swipify 和 Wear Mini Launcher 如何拦截Android Wear主屏幕上的触摸事件 到目前为止 我已尝试将 onTouch 和 onClick 侦听器添加到应用程序中
  • Python 的 argparse 可以像 gnu getopt 一样排列参数顺序吗?

    GNU getopt 和使用它的命令行工具允许选项和参数交错 称为排列选项 请参阅http www gnu org software libc manual html node Using Getopt html Using Getopt