【Python脚本】getopt参数解析笔记

getopt参数解析笔记

背景

在 Python 中,使用 getopt 模块进行命令行参数解析是常见的需求。在编写脚本时,正确地定义参数选项对于确保程序正常运行至关重要。这是一个用于检测安卓软件版本的脚本一部分,有些用法和笔记分享给大家

问题描述

在某个脚本中,使用 getopt 解析命令行参数时,发现如果指定参数选项但不传递参数就会导致后续所有参数无法正确接收参数。发现参数定义还分两种情况。

所有参数选项必须带参数的定义传参

opts, args = getopt.getopt(sys.argv[1:], "e:a:d:o:n:", ["expected=", "actual=", "device", "out", "sn="])

-d/-o都不需要参数的传参定义

opts, args = getopt.getopt(sys.argv[1:], "e:a:dd:oo:n:", ["expected=", "actual=", "device", "out", "sn="])
#or
opts, args = getopt.getopt(sys.argv[1:], "e:a:d o n:", ["expected=", "actual=", "device", "out", "sn="])

原因分析
参数需求:
使用冒号(:)表示该选项后面需要跟随参数。例如,-e 选项后需要一个期望的版本号。
将 -d 和 -o 定义为 d: 和 o: 表示它们后面需要参数,而实际上它们是布尔开关,不需要参数。

解决方案
通过将 -d 和 -o 重复定义为 dd: 和 oo:,也不需要参数。
通过将 -d 和 -o 去除引号定义为 d 和 o ,定义为布尔开关,不需要参数。

示例代码
以下是完整的示例代码,展示如何正确解析命令行参数:

import sys
import getoptif __name__ == '__main__':print("parameter:")try:opts, args = getopt.getopt(sys.argv[1:], "e:a:dd:oo:n:", ["expected=", "actual=", "device", "out", "num="])except getopt.GetoptError as err:print(f"Error: {err}")sys.exit(1)expected_version = Noneactual_version = Nonedevice = Falseout_param = Falsedevice_num = Noneprint(f"opts: {opts}")  # 打印解析的选项for opt, arg in opts:if opt in ('-e', '--expected'):expected_version = argprint(f"Expected version: {expected_version}")elif opt in ('-a', '--actual'):actual_version = argprint(f"Actual version: {actual_version}")elif opt in ('-d', '--device'):device = Trueprint("Device mode selected.")elif opt in ('-o', '--out'):out_param = Trueprint("Output mode selected.")elif opt in ('-n', '--sn'):device_num = arg# 后续逻辑...

实际运行
运行命令时,可以使用以下格式:

python3 ./build_scripts/ParseDLToolsVersion/checkComponentVersions2.py -o -e ./build_scripts/release_info/prebuild_version_expected.txt -a ./o
utversion.txt
parameter:
opts: [('-o', ''), ('-e', './build_scripts/release_info/prebuild_version_expected.txt'), ('-a', './outversion.txt')]

总结

去掉冒号:确保 -d 和 -o 不带冒号,以便它们被视为布尔开关。
理解参数定义:通过理解 getopt 的参数定义规则,可以避免常见的解析错误,确保命令行参数能够被正确处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1560102.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

k8s部署学习

8s的架构 一个kubernetes集群主要是由控制节点(master)、工作节点(node)构成,每个节点上都会安装不同的组件 1 master:集群的控制平面,负责集群的决策 ApiServer : 资源操作的唯一入口,接收用户输入的命令,提供认证、…

Java中对象的比较(equals、Comparable、Comparator)

文章目录 一、PriorityQueue中插入对象二、元素的比较 2.1、基本类型的比较2.2、对象比较的问题三、对象的比较 3.1、覆写基类的equals3.2、基于Comparable接口类的比较3.3、基于比较器比较3.4、三种方式对比 一、PriorityQueue中插入对象 前篇我们讲解了优先级队列&#xff0…

qt小练习

制作简易闹钟 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimer> //定时器类 #include <QDebug> //信息调试类 #include <QMessageBox> //消息对话框类 #include <QTime> //时间类 #include…

大模型日报|4 篇必读的大模型论文

大家好&#xff0c;今日必读的大模型论文来啦&#xff01; 1.清华、北航团队推出多智能体代码异常处理框架 Seeker 在现实世界的软件开发中&#xff0c;异常处理不当或缺失会严重影响代码的鲁棒性和可靠性。异常处理机制要求开发人员按照高标准来检测、捕获和管理异常&#x…

全网最详细k8s搭建部署

目录 Kubernetes的功能&#xff1a; Kubernetes的特点&#xff1a; 1. 安装要求 2. 部署内容 1、系统环境准备 2、所有禁用swap和本地解析 3、仓库配置&#xff0c;所有安装docker 4、所有节点设定docker的资源管理模式为systemd 5、所有阶段复制harbor仓库中的证书并…

python中计算分布的分位数及累积概率

本文讨论python中怎样计算分布的分位数及累积概率 ⭐️ 根据累计概率获取分位数 在 Python 中&#xff0c;你可以使用 scipy.stats 中的 ppf&#xff08;percent point function&#xff09;来根据累积概率获取分位数。ppf 是逆累积分布函数&#xff0c;也就是根据给定的累积…

前端笔记(一):父传子,子传父,获取DOM对象或组件,别名路径联想设置,elemntPlus

一、父传子 二、子传父 三、获取DOM对象或组件 把子组件的属性暴露给父组件 四、别名路径联想设置 1.jsconfig里只做联想配置&#xff1b; 2.vue.config.js里做实际转换&#xff0c;把转为src&#xff1b; 五、elemntPlus 1.按需导入 ①npm install element-plus --sav…

适合高新技术企业的内外网文件交换系统

在科技前沿的战场上&#xff0c;数据的快速和安全流通是企业维持竞争优势的关键。随着企业业务的全球化和科技的持续进步&#xff0c;内外网文件交换的需求不断增长&#xff0c;这同时也带来了一系列挑战。本文将讨论科技前沿领域在内外网文件交换中所面临的挑战&#xff0c;并…

【技术支持】家里智能电视不能联网重置小米路由器之路

问题现象 最近家里的路由器出现一点问题&#xff0c;现象是手机和电脑连接wifi后&#xff0c;都可以正常打开网页看视频。 但是小爱同学和小米盒子&#xff0c;都出现网络问题&#xff0c;不能正常播放音乐或者视频。 这是小米盒子的网络问题截图 这是和小米盒子连接的智能电…

AI时代大厂AI项目管理学习路线

AI时代避免被裁员&#xff0c;大厂AI项目管理学习路线主要包括&#xff1a; 1、AI项目管理基础技能。 2、项目管理AI技术知识。 3、数据分析与决策。 4、AI项目管理工具。 5、AI项目管理知识扩展。 01 AI项目管理基础技能。 AI项目管理基础技能构成了项目管理的骨架&…

Spring WebFlux 核心原理(2-1)

1、Spring 响应式编程 1.1、早期响应式解决方案 响应式编程是构建响应式系统的主要候选方案。Spring 4.x 引入了 ListenableFuture 类&#xff0c;它扩展了 Java Future&#xff0c;并且可以基于 HTTP 请求实现异步执行操作。但是只有少数 Spring 4.x 组件支持新的 Java 8 Com…

VScode连接服务器配置c、c++编程环境

在 VS Code 中配置远程服务器的 C/C 编程环境&#xff0c;可以使用 VS Code 的 Remote-SSH 扩展来通过 SSH 连接到远程服务器&#xff0c;并在服务器上编写、编译和调试 C/C 代码。 以下是详细的配置步骤&#xff1a; 1. 在本地机器上安装 VS Code 和扩展 安装 VS Code&#…

360度评估与绩效考核的深度融合,助力员工提升自我

客户背景 该零售业企业是一家集水果采购、种植支持、采后保鲜、物流仓储、标准分级、营销拓展、品牌运营、门店零售、信息科技、金融资本、科研教育于一体的大型连锁企业。 在当今快速变化的商业环境中&#xff0c;企业对于人才管理的要求日益提高&#xff0c;传统的绩效考核方…

WPF 为button动态设置不同的模板

有时候需要动态的设置一些按钮的状态模板。使一个button显示不同的内容&#xff0c;比如Button未点击安装显示&#xff1a; 安装后显示&#xff1a; 可以通过设置button的content&#xff0c;通过content来设置不同的模板来实现功能&#xff0c;以下是代码&#xff1a; MainWi…

基于springboot+vue的在线宠物用品交易网站

一、系统架构 前端&#xff1a;vue | element-ui | html 后端&#xff1a;springboot | mybatis-plus 环境&#xff1a;jdk1.8 | mysql | maven | nodejs 二、代码及数据库 三、功能介绍 01. web端-首页1 02. web端-首页2 03. web端-注册 04. web端-登录 05. w…

服装生产管理:SpringBoot框架的高效策略

5 系统的实现 5.1 登录界面的实现 用户要想进入本系统必须进行登录操作&#xff0c;进入对应角色登录界面&#xff0c;在登录界面输入系统账号、登录密码&#xff0c;选择登录类型&#xff0c;点击登录按钮进行登录系统&#xff0c;管理员登录界面展示如图5-1所示&#xff0c…

2024 kali虚拟机安装教程,分两大步骤,图文讲解(1)

第二步链接&#xff1a; 2024 kali虚拟机安装教程&#xff0c;分两大步骤&#xff0c;图文讲解&#xff08;2&#xff09;-CSDN博客 准备工作 1.kali的iso镜像文件 2.VMware Workstation Pro 虚拟机软件 正式开始 1.创建新的虚拟机&#xff0c;勾选自定义&#xff08;高级…

iOS用户必看:Xinstall助力浏览器秒开App

在移动互联网时代&#xff0c;App已成为我们日常生活中不可或缺的一部分。然而&#xff0c;对于iOS用户来说&#xff0c;有时在浏览器中遇到需要打开特定App的场景时&#xff0c;却可能会遇到一些不便。幸运的是&#xff0c;有了Xinstall&#xff0c;这一切都变得简单而高效。 …

Linux——echo-tail-重定向符

echo命令 类似printf 输出 反引号 重定向符 > 和 >> > 覆盖 >> 追加 tail命令 查看文件尾部内容&#xff0c;追踪文件最新更改 tail -num 从尾部往上读num行&#xff0c;默认10行 tail -f 持续跟踪

C++初阶--C++入门(引用篇)

目录 一、引用的基本概念与特性 1.定义与声明 2.特性 二、引用的进阶用法 1.函数参数传递&#xff1a; 2.引用作为函数返回值&#xff08;重点&#xff09; 引用作为返回值的优点 引用作为返回值的注意事项 代码示例 注意事项的进一步说明 三、传值和传引用效率比较 …