当前位置: 首页 > news >正文

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:用于将对象转换为右值引用,通常用于启用移动语义并转移所有权 示例: 先看一个简单的示例&#xff0…...

PHP探索校园新生态校园帮小程序系统小程序源码

探索校园新生态 —— 校园帮小程序系统,让生活更精彩! 🌱【开篇:走进未来校园,遇见新生态】🌱 你是否厌倦了传统校园的繁琐与单调?是否渴望在校园里也能享受到便捷、智能的生活体验&#xff1…...

通信工程学习:什么是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++类和对象(中)【下篇】

&#x1f31f;个人主页&#xff1a;落叶 &#x1f31f;当前专栏: C专栏 目录 赋值运算符重载 运算符重载 赋值运算符重载 日期类实现 运算符重载<和运算符重载 运算符重载进行复用 运算符重载< 运算符重载> 运算符重载> 运算符重载! 获取某年某月的天数…...

【亿美软通-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…...

数据分析学习之学习路线

前言 我们之前通过cda认证了解到数据分析行业&#xff0c;但是获取到证书&#xff0c;并不代表着&#xff0c;我们已经拥有的数据分析的能力&#xff0c;所以通过系统的学习数据分析需要掌握的能力&#xff0c;并学习大佬们的分析经验、分析思路&#xff0c;才是成为数据分析师…...

Oracle逻辑备份脚本【生产环境适用】

1 说明 从Oracle10g开始&#xff0c;引入了数据泵&#xff08;Data Pump&#xff09;&#xff0c;是一种高效的数据传输工具&#xff0c;它通过导出&#xff08;Export&#xff09;和导入&#xff08;Import&#xff09;的方式帮助用户迁移数据。 在Oracle的产品设计中&#…...

Python范例总结

一、基础功能 1、操作符 and 拥有更高优先级&#xff0c;会先行运算。优先级顺序为 NOT、AND、OR。 2、列表 1&#xff09;列表拼接 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&#xff09;范…...

若依生成主子表

一、准备工作 确保你已经部署了若依框架&#xff0c;并且熟悉基本的开发环境配置。同时&#xff0c;理解数据库表结构对于生成代码至关重要。 主子表代码结构如下&#xff08;字表中要有一个对应主表ID的字段作为外键&#xff0c;如下图的customer_id&#xff09; -- ------…...

dotnet4.0编译问题

因为最近在写cobaltstrike的execute-assembly内存加载的c#项目 用visual studio2022编译&#xff0c;最低net只能用6.0版本的&#xff0c;并且execute-assembly不支持 我想使用4.x版本进行编译&#xff0c;因为visual studio不支持&#xff0c;那么使用命令行进行编译 因为要用…...

研一奖学金计划2024/9/23有感

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、需要认真上课的1.应用数理统计&#xff08;开卷考试&#xff09;2.最优化方法&#xff08;开卷考试&#xff09;3.跨文化交际&#xff08;主题演讲20课堂讨…...

html知识点框架

一、HTML基础 HTML简介 HTML是一种超文本标记语言&#xff0c;用于创建网页和网页应用。HTML5是公认的下一代Web语言&#xff0c;极大地提升了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…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话&#xff1a; “利润不是赚出来的&#xff0c;是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业&#xff0c;很多企业看着销售不错&#xff0c;账上却没钱、利润也不见了&#xff0c;一翻库存才发现&#xff1a; 一堆卖不动的旧货…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...