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

Spring源码学习:SpringMVC(3)mvcannotation-driven标签解析【RequestMappingHandlerMapping生成】

目录 前言mvc:annotation-driven标签概述mvc:annotation-driven标签解析【RequestMappingHandlerMapping生成】AnnotationDrivenBeanDefinitionParser#parse &#xff08;解析入口&#xff09;RequestMappingHandlerMapping的实例化类图afterPropertiesSetAbstractHandlerMetho…...

2024 Redis 全部

1. 单机部署 1.1 检查环境&#xff0c;创建目录。 # 本地运行&#xff0c;不需要考虑安装的原因&#xff0c;可以卸载防火墙 # 关闭防火墙 systemctl stop firewalld.service# 查看防火强状态 firewall-cmd --state# redis 是基于gcc 环境的&#xff0c;查看是否有 gcc 环境 …...

[SDX35+WCN6856]SDX35 + WCN6856 WiFi可以up起来之后无法扫描到SSID

SDX35 SDX35介绍 SDX35设备是一种多模调制解调器芯片,支持 4G/5G sub-6 技术。它是一个4nm芯片专为实现卓越的性能和能效而设计。它包括一个 1.9 GHz Cortex-A7 应用处理器。 SDX35主要特性 ■ 3GPP Rel. 17 with 5G Reduced Capability (RedCap) support. Backward compati…...

VisualStudio如何卸载Resharper插件?

本来按理说&#xff0c;卸载插件应该就是在扩展下的已安装插件中&#xff0c;找到该插件&#xff0c;点一下就会出现卸载的按钮的。 没想到这个Resharper这么吊&#xff0c;卸载按钮居然是个灰色的&#xff0c;意思就是此路不通&#xff0c;有特权的。 那么这种情况下&#x…...

Unity Debug时出现请选择unity实例

Unity Debug时出现请选择unity实例 问题描述 出现请选择unity实例&#xff0c;并且选择框里为空。 出现原因 你打开了两个Unity工程&#xff0c;在附加时&#xff0c;不知道加在哪个Unity工程上。 解决方法 在调试窗口中点击“附加Unity调试程序”&#xff0c;然后在弹出…...

国庆出行新宠:南卡Pro5骨传导耳机,让旅途不再孤单

国庆长假即将来临&#xff0c;对于热爱旅行和户外运动的朋友们来说&#xff0c;一款适合旅行使用的耳机无疑是提升旅途体验的神器。今天&#xff0c;我要向大家推荐一款特别适合国庆出行的耳机——南卡Runner Pro5骨传导耳机。作为一名热爱旅游的体验者&#xff0c;我强烈推荐南…...

2024.09.18 leetcode 每日一题

二进制求和 给你两个二进制字符串 a 和 b &#xff0c;以二进制字符串的形式返回它们的和。 https://leetcode.cn/problems/add-binary/description/ 代码一&#xff0c;尝试使用笨办法&#xff0c;会造成溢出 class Solution { public:string addBinary(string a, string …...

快递物流短信API接口代码

官网&#xff1a;快递鸟 API参数 用户信息类 一.短信模版 1.接口说明 使用快递鸟短信功能时&#xff0c;预先设置好短信模板和对应的发送规则&#xff0c;快递鸟短信API将根据设置的好的模板和规则&#xff0c;进行短信的发送和反馈。 (1)仅支持Json格式。 (2)请求指令810…...

人工智能-机器学习-深度学习-分类与算法梳理

目前人工智能的概念层出不穷&#xff0c;容易搞混&#xff0c;理清脉络&#xff0c;有益新知识入脑。 为便于梳理&#xff0c;本文只有提纲&#xff0c;且笔者准备仓促&#xff0c;敬请勘误&#xff0c;不甚感激。 请看右边目录索引 。 人工智能 三大派系 符号主义(Symbolists…...

Xinference:深度学习模型推理与优化指南

目录 1. 什么是 Xinference&#xff1f; 2. 使用 Xinference 进行模型推理 2.1 安装 Xinference 2.2 模型推理示例 3. 提高模型推理的效率和性能 3.1 模型量化 3.2 并行处理 3.3 批量处理 4. 启用网页端&#xff08;如果支持&#xff09; 5. 在 CPU 中的注意事项 6. …...