python脚本程序怎么写更优雅?argparse模块巧妙应用
前言
命令行程序,也称CLI程序,另一个直观的名字是脚本程序,简称脚本,由于没有图形用户界面(GUI),所以脚本程序常见的交互方式有3种:
1、脚本程序中读取环境变量,比如env等命令
2、脚本程序中读取传入的命令行参数,比如ls、adb程序
3、脚本程序中读取文件内容,比如nginx程序
今天我们一起学习第二种,脚本程序中传入命令行参数这种方式,如果想优雅的编写python脚本程序,怎么能离开argparse模块呢?
命令行参数的分类
脚本程序,离不开命令行参数,命令行参数根据标准特性分为以下7种:
1、位置参数(必选参数)
python hello_world.py hello man
空白字符隔开,python后面的3个参数均为命令行参数,单词中没有"-"
2、可选参数,单个短参数,无参数值
ls -l
空白字符隔开,减号+字母的组合,短参数使用的还挺多,上方介绍ls -l,-l就是短参数
3、可选参数,单个短参数,有参数值
python hello_world.py -n wangyuanwai
-n wangyuanwai,也是通过空白字符隔开,-n后面的参数,作为参数值传递到脚本程序中
4、可选参数,长参数,无参数值
python hello_world.py --verbose
长参数,一般使用--xxxx,使用两个减号,这样的参数我们平时都是在脚本程序中使用的,也是为了方便阅读
5、可选参数,长参数,有参数值
python hello_world.py --name wangyuanwai
这也是最常用的一种方式了,--name 后面跟着是参数值
6、组合
python hello_world.py -v --name wangyuanwai
就是将上面几种参数组合起来使用
7、非标准那种传参,历史原因,不建议用,尤其是tar命令……
ps -ef
tar -cvf home_backup.tar /home
argparse作者信息
argparse模块用于解析命令行参数的模块,位于python标准库中,写python脚本程序,建议一定要学习argparse模块,这样你的程序就和作者一样优雅了!!

截止到2021年11月6日:argparse模块一共2575行代码
源码位置:lib/argparse.py文件中
作者:Steven J. Bethard
当前维护者:Raymond Hettinger
argparse怎么使用的详细讲解
我来解释一下下面3行代码是干什么的!
import argparsemy_parse = argparse.ArgumentParser()my_parse.add_argument("fake", action="store", help="what is fake?")name_space = my_parse.parse_args()
1、导入argparse模块
import argparse
2、创建ArgumentParser对象,同时赋值给一个全局变量
my_parse = argparse.ArgumentParser()
3、调用ArgumentParser的add_argument()方法添加一个命令行参数
my_parse.add_argument("fake", action="store", help="what is fake?")
5、调用ArgumentParser的parse_args()方法后,命令行参数会被保存下来,同时返回一个namespace对象
name_space = my_parse.parse_args()
平时使用的时候,就这几个步骤
1、创建ArgumentParser对象
2、添加命令行参数
3、获取namespace对象提取传入的命令行参数
让我们第一次实操
先写一个my_demo.py,只有3行代码
import argparsemy_parse = argparse.ArgumentParser()my_parse.parse_args()
命令行输入
python my_demo.py
输出结果:
# 空的,什么都没有
由于我们什么也没做,命令行参数部分什么也没做
能力1:argparse模块可以返回帮助信息,当然支持自定义
命令行输入
python my_demo.py -h#或者python my_demo.py --help
输出结果
usage: my_demo.py [-h]optional arguments:-h, --help show this help message and exit
这段在标准输出中的文本信息是argparse模块返回的,当传入短选项参数-h或者完整参数--help,argparse就会在标准输出中打印帮助信息,下面我来详细解释一下他们
usage:my_demo.py [-h]
usage开头的这行表示使用的是my_demo.py脚本,后面的-h指这个脚本可接受一个可选参数为-h
optional arguments:
optional argments这行开始,表示有哪些可选参数
-h, --help show this help message and exit
表示一个可选参数的作用,告知可传入短参数-h,或者完整的选项参数--help,接着为-h参数的解释,此处表示-h的参数是用于展示帮助信息,然后程序会结束,后面我会告诉大家怎么添加帮助信息
能力2:argparse模块会自动检测无效的命令行参数
命令行输入
python my_demo.py -w
输出结果:
usage: my_demo.py [-h]
my_demo.py: error: unrecognized arguments: -w
选项参数-w并不是my_demo.py脚本程序支持的命令行参数,argparse模块会获取到该选项参数,然后提示:错误,-w是不符合要求的参数。
我们的脚本程序my_demo.py中,不支持选项参数-w,argparse模块会自动完成对命令行参的容错,这意味着使用argparse模块,我们不必再为错误的命令行参数进行容错
能力3:argparse模块自动检测未传入的位置参数
import argparsemy_parse = argparse.ArgumentParser()my_parse.add_argument("age") #加了一个位置参数my_parse.parse_args()
添加位置参数,使用ArgumentParser对象的add_argument()方法,为它传入一个字符串参数,表示位置参数,位置参数也称必选参数,我们尝试执行脚本
命令行输入
python my_demo.py
输出结果
usage: my_demo.py [-h] age
my_demo.py: error: the following arguments are required: age
报错了,原因是缺少位置参数,控制台(猜测是标准错误)展示argparse模块生成的错误信息,提示:错误,以下参数必须设置:age(位置参数的名称)
命令行输入
python my_demo.py 18
输出结果:
#空的,什么都没有
这次不再报错,因为我们传入了位置参数18(命令行中通过空格字符分隔脚本名称与参数),此时我们的脚本程序什么都没做,所以控制台什么都看不到!为什么位置参数必须传入呢?接下来解释一下什么是位置参数!
什么是位置参数?
什么是位置参数?它的名字,正是由于其位置而得名!
命令行输入:
python my_demo.py 18
此时的参数18位于脚本文件my_demo.py的后面,它是位置参数,由于在第1个位置,所以也称作第1个位置参数(空白字符用来分隔参数)
如何使用位置参数?
import argparsemy_parse = argparse.ArgumentParser()my_parse.add_argument("age") # 添加一个位置参数name_space = my_parse.parse_args()print("你的年龄:" + name_space.age) # 使用命令行参数值
命令行输入:
python my_demo.py 18
输出结果:
你的年龄:18
parse_args()方法会返回1个Namespace对象,我们需要将该对象保存到变量中,然后访问Namespace对象的属性即可获取传入的命令行参数值,重点在这行代码:
name_space.age

注意:Namespace中的属性名,是你添加位置参数时指定的属性名,见红色箭头
再次添加一个位置参数
import argparsemy_parse = argparse.ArgumentParser()my_parse.add_argument("age") # 加了一个位置参数my_parse.add_argument("sex") # 又加了一个位置参数name_space = my_parse.parse_args()print("你的年龄:" + name_space.age) # 使用命令行参数值
print("我的性别:" + name_space.sex)
命令行输入:
python my_demo.py 18 男
输出结果:
你的年龄:18
我的性别:男
第一次使用了2个位置参数,这时候的脚本程序必须传入2个参数才能执行成功,2个参数同样也使用空白字符隔开(空格字符、制表符、任何个空格字符均可)
为位置参数添加帮助信息
#省略代码…………my_parse.add_argument("age",help="请传入你的年龄") # 添加帮助信息my_parse.add_argument("sex",help="请传入您的性别") # 添加帮助信息#省略代码…………
命令行输入:
python my_demo.py -h或者python my_demo.py --help
输出结果:
usage: my_demo.py [-h] age sexpositional arguments:age 请输入您的年龄sex 请输入您的性别optional arguments:-h, --help show this help message and exit
如果只是添加了位置参数,而命令行的使用者并不知道该参数的作用,所以添加位置参数时,可以使用add_argument()的help关键字参数添加帮助信息
如果需要获悉脚本程序如何使用?仅需执行python xxx.py --help,即可知道脚本程序规定的参数用途是什么
能力4:添加简短的可选参数,由于是可选参数,未传入也不报错
#省略代码……my_parse.add_argument("-c") # 添加一个可选参数#省略代码……print("我的国籍:" + name_space.c if name_space.c else "空") # 使用可选参数
命令行输入:
python my_demo.py 18 男
输出结果:
你的年龄:18
我的性别:男
空
添加可选参数-c(短参数),意味着可以不传入可选参数,脚本程序照样执行
访问短参数表示的命令行参数,直接通过不包含-的参数名即可,如果是-c,我们仅需使用name_space.c即可访问
能力4:添加完整的可选参数
#省略代码……my_parse.add_argument("--country") # 添加一个完整的可选参数#省略代码……print("我的国籍:" + name_space.country if name_space.country else "空") # 使用可选参数
命令行输入:
python my_demo.py 18 男 --country 中国
输出结果:
你的年龄:18
我的性别:男
我的国籍:中国
完整的选项参数,也称作长参数,使用--开头,它比短参数的语义更明确,更适用在其它脚本程序中使用
访问长参数的选项参数值,仅需使用name_space.country即可,不包括--
能力4:添加一个即可用短参数、又可用长参数的可选参数
#省略代码……my_parse.add_argument("-c", "--country") # 添加一个即有短参数,又有长参数的可选参数#省略代码……print("我的国籍:" + name_space.country if name_space.country else "空") # 使用可选参数
命令行输入:
python my_demo.py 18 男 --country 中国
或者
python my_demo.py 18 男 -c 中国
输出结果:
你的年龄:18
我的性别:男
我的国籍:中国
由于该可选参数--country,也指定了-c作为短参数,所以你即可以使用-c,也可以使用--country传入命令行参数,非常方便
注意:此时不能使用name_space.c读取命令行参数,当同时存在时,必须使用长参数获取Namespace对象的属性(这个坑不坑……)
告诉用户,你的命令行程序的用途?
#省略代码……my_parse = argparse.ArgumentParser(description="我这个程序主要是讲解argparse模块的使用")#省略代码……
在ArgmentParse对象初始化时,可以传入关键字参数description,指定的字符串将作为程序的说明
命令行输入:
python my_demo.py -h
输出结果:
usage: my_demo.py [-h] [-c COUNTRY] age sex我这个程序主要是讲解argparse模块的使用positional arguments:age 请输入您的年龄sex 请输入您的性别optional arguments:-h, --help show this help message and exit-c COUNTRY, --country COUNTRY
我们可以清晰的看到程序说明,这对命令行程序很重要,用户使用python my_demo.py -h 或者 python my_demo.py --help去查看你的脚本程序怎么使用!
总结
1、argparse模块是python的标准库
2、argparse模块格局标准,对位置参数、可选参数进行了默认的处理
3、默认支持返回帮助信息
4、以后写python命令行模块,用argpase模块就对了。。。
5、更多的使用方法,请参考官方文档:argparse 教程 — Python 3.12.6 文档
相关文章:
python脚本程序怎么写更优雅?argparse模块巧妙应用
前言 命令行程序,也称CLI程序,另一个直观的名字是脚本程序,简称脚本,由于没有图形用户界面(GUI),所以脚本程序常见的交互方式有3种: 1、脚本程序中读取环境变量,比如env…...
【React】(推荐项目)使用 React、Socket.io、Nodejs、Redux-Toolkit、MongoDB 构建聊天应用程序 (2024)
使用 React、Socket.io、Nodejs、Redux-Toolkit、MongoDB 构建聊天应用程序 (2024) 学习使用 React、Socket.io、Node.js、Redux-Toolkit 和 MongoDB 构建响应式实时消息聊天应用程序。这个项目涵盖了从设置到实施的所有内容,提供了宝贵的见解和实用技能。无论您是…...
C++:std::move 和 std::forward
先说结论: std::forward:用于完全按照传递的参数转发,保留其值类别(左值或右值)std::move:用于将对象转换为右值引用,通常用于启用移动语义并转移所有权 示例: 先看一个简单的示例࿰…...
PHP探索校园新生态校园帮小程序系统小程序源码
探索校园新生态 —— 校园帮小程序系统,让生活更精彩! 🌱【开篇:走进未来校园,遇见新生态】🌱 你是否厌倦了传统校园的繁琐与单调?是否渴望在校园里也能享受到便捷、智能的生活体验࿱…...
通信工程学习:什么是MANO管理编排
MANO:管理编排 MANO:Management and Network Orchestration(管理和网络编排)在网络功能虚拟化(NFV)架构中扮演着至关重要的角色。MANO是一个由多个功能实体组合而成的层次,这些功能实体负责管理…...
备战软考Day04-计算机网络
1、计算机网络的分类 2、七层网络体系结构 3、网络的设备与标准 4、TCP/IP协议族 TCP/IP作为Internet的核心协议,被广泛应用于局域网和广域网中,目前已成为事实上的国际标准 1、TCP/IP分层模型 TCP/IP协议是Internet的基础和核心,和OSI参考…...
可以把台式电脑做成服务器吗
是的,台式电脑可以被改造成服务器。以下是一些步骤和考虑因素,可以帮助你实现这一目标: 1. 选择合适的操作系统 Windows Server:如果你习惯于Windows环境,可以选择Windows Server版本,适合运行多种服务&a…...
JavaScript 输出方式
JavaScript 提供了多种输出方式,用于在浏览器中显示信息。以下是几种常见的输出方式及其详细代码示例: 1. console.log() 用于在浏览器的开发者控制台输出信息,常用于调试。 优点: 调试方便:可以输出任意类型的数据&…...
微服务(一)
目录 一、概念 1、单体架构 2、微服务 3、springcloud 二、微服务的拆分 1、微服务的拆分原则 1.1 什么时候拆 1.2 怎么拆 2、服务调用 2.1 resttemplate 2.2 远程调用 一、概念 1、单体架构 单体架构(monolithic structure):顾名…...
Uniapp时间戳转时间显示/时间格式
使用uview2 time 时间格式 | uView 2.0 - 全面兼容 nvue 的 uni-app 生态框架 - uni-app UI 框架 <text class"cell-tit clamp1">{{item.create_time}} --- {{ $u.timeFormat(item.create_time, yyyy-mm-dd hh:MM:ss)}} </text>...
C++类和对象(中)【下篇】
🌟个人主页:落叶 🌟当前专栏: C专栏 目录 赋值运算符重载 运算符重载 赋值运算符重载 日期类实现 运算符重载<和运算符重载 运算符重载进行复用 运算符重载< 运算符重载> 运算符重载> 运算符重载! 获取某年某月的天数…...
【亿美软通-注册/登录安全分析报告】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...
数据分析学习之学习路线
前言 我们之前通过cda认证了解到数据分析行业,但是获取到证书,并不代表着,我们已经拥有的数据分析的能力,所以通过系统的学习数据分析需要掌握的能力,并学习大佬们的分析经验、分析思路,才是成为数据分析师…...
Oracle逻辑备份脚本【生产环境适用】
1 说明 从Oracle10g开始,引入了数据泵(Data Pump),是一种高效的数据传输工具,它通过导出(Export)和导入(Import)的方式帮助用户迁移数据。 在Oracle的产品设计中&#…...
Python范例总结
一、基础功能 1、操作符 and 拥有更高优先级,会先行运算。优先级顺序为 NOT、AND、OR。 2、列表 1)列表拼接 l1 [1,2,3] l2 [4,5,6]# 方法1 # l1 l1 l2# 方法2 # l1[len(l1):len(l1)] l2# 方法3 l1.extend(l2) print(l1) 3、函数 1)范…...
若依生成主子表
一、准备工作 确保你已经部署了若依框架,并且熟悉基本的开发环境配置。同时,理解数据库表结构对于生成代码至关重要。 主子表代码结构如下(字表中要有一个对应主表ID的字段作为外键,如下图的customer_id) -- ------…...
dotnet4.0编译问题
因为最近在写cobaltstrike的execute-assembly内存加载的c#项目 用visual studio2022编译,最低net只能用6.0版本的,并且execute-assembly不支持 我想使用4.x版本进行编译,因为visual studio不支持,那么使用命令行进行编译 因为要用…...
研一奖学金计划2024/9/23有感
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、需要认真上课的1.应用数理统计(开卷考试)2.最优化方法(开卷考试)3.跨文化交际(主题演讲20课堂讨…...
html知识点框架
一、HTML基础 HTML简介 HTML是一种超文本标记语言,用于创建网页和网页应用。HTML5是公认的下一代Web语言,极大地提升了Web在富媒体、富内容和富应用等方面的能力。HTML基本结构 基本的HTML文档结构包括<!DOCTYPE html>, <html>, <head&g…...
SpringBoot的应用
目录 一、springboot的应用 1、创建springboot项目 2、乱码问题配置 3、springboot日志配置 4、springboot整合mybatis 二、配置文件讲解及测试 1、全局配置文件参数读取 1.1 全局配置文件的位置 1.2 配置文件的读取 1.2.1 导包 1.2.2 编写配置对象Bean 1.2.3 编写配置文件 1.2…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
