当前位置: 首页 > 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…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

HTML前端开发:JavaScript 获取元素方法详解

作为前端开发者&#xff0c;高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法&#xff0c;分为两大系列&#xff1a; 一、getElementBy... 系列 传统方法&#xff0c;直接通过 DOM 接口访问&#xff0c;返回动态集合&#xff08;元素变化会实时更新&#xff09;。…...

Android写一个捕获全局异常的工具类

项目开发和实际运行过程中难免会遇到异常发生&#xff0c;系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler&#xff0c;它是Thread的子类&#xff08;就是package java.lang;里线程的Thread&#xff09;。本文将利用它将设备信息、报错信息以及错误的发生时间都…...

OPENCV图形计算面积、弧长API讲解(1)

一.OPENCV图形面积、弧长计算的API介绍 之前我们已经把图形轮廓的检测、画框等功能讲解了一遍。那今天我们主要结合轮廓检测的API去计算图形的面积&#xff0c;这些面积可以是矩形、圆形等等。图形面积计算和弧长计算常用于车辆识别、桥梁识别等重要功能&#xff0c;常用的API…...

JUC并发编程(二)Monitor/自旋/轻量级/锁膨胀/wait/notify/锁消除

目录 一 基础 1 概念 2 卖票问题 3 转账问题 二 锁机制与优化策略 0 Monitor 1 轻量级锁 2 锁膨胀 3 自旋 4 偏向锁 5 锁消除 6 wait /notify 7 sleep与wait的对比 8 join原理 一 基础 1 概念 临界区 一段代码块内如果存在对共享资源的多线程读写操作&#xf…...