python脚本程序怎么写更优雅?argparse模块巧妙应用

news2024/11/18 19:42:18

前言

    命令行程序,也称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 argparse

my_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 argparse

my_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 argparse

my_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 argparse

my_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 argparse

my_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 sex

positional 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 文档

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

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

相关文章

解决小爱音箱连接Windows10蓝牙时,语音控制会中断音乐播放的问题

解决天猫精灵连接Windows10蓝牙时,语音控制会中断音乐播放的问题 解决小爱音箱连接Windows10蓝牙时,浏览器控制音量会中断音乐播放的问题 用小爱音箱当蓝牙音响的时候,遇到个很困扰的问题,每次小爱音箱语音控制的过程中,都会启动…

3.js - 运动曲线

这个球,绕着这个红色的线圈转 代码 import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControlslet scene,camera,renderer,controls nulllet moon,earth null// 根据,一系列的点,创建曲线 le…

活动报名丨智源Workshop,从o1出发探索LLM推理与思维链

近期o1模型的发布,预示着AI在处理高度复杂问题上再次迈出一大步。大规模强化学习算法在一个数据极高的训练过程中,教会了模型如何利用其思维链进行富有成效的思考。 北京时间9月19日(本周四)晚7点,智源社区将组织「智源…

响应式布局-媒体查询父级布局容器

1.响应式布局容器 父局作为布局容器,配合自己元素实现变化效果,原理:在不通过屏幕下面吗,通过媒体查询来改变子元素的排列方式和大小,从而实现不同尺寸屏幕下看到不同的效果。 2.响应尺寸布局容器常见宽度划分 手机-…

Vue 中 watch 的使用方法及注意事项

前言 Vue 的 Watch 是一个非常有用的功能,它能够监听 Vue 实例数据的变化并执行相应的操作。本篇文章将详细介绍 Vue Watch 的使用方法和注意事项,让你能够充分利用 Watch 来解决 Vue 开发中的各种问题。 1. Watch 是什么? 1.1 Watch 的作…

[js逆向学习] fastmoss电商网站——店铺排名

逆向目标 网站:https://www.fastmoss.com/shop-marketing/tiktok接口:https://www.fastmoss.com/api/shop/shopList/参数:fm-sign 逆向分析 我们今天要分析的是店铺排名,先分析网络请求,找到目标接口 按照上图操作…

Redis: 特点,优势,与其他产品的区别以及高并发原理

入门Redis概述 1 )选择Redis是因为其高性能 因为 Redis 它数据存储的机制是存在内存中的,减少了传统关系数据库的磁盘IO它是单线程的保证了原子性,它还提供了事务,锁等相关的机制 2 )Redis 环境安装配置 linux 或 d…

STM32 map 文件浅析

目录 一、概述二、Section Cross References三、Removing Unused input sections from the image四、Memory Map of the image1、Local Symbols2、全局符号(Global Symbols) 五、Image Symbol Table六、Image component sizes 一、概述 .map 文件是编译…

Shader Graph Create Node---Input

四、Input 1、Basic 一些基础的变量节点 2、Geometry 1)、Bitangent Vector(双切线向量) 通常与顶点位置、法线向量和切线向量一起使用。 法线向量(Normal Vector):垂直于表面的向量。 切线向量(Tangent Vector)…

Vue3项目开发——新闻发布管理系统(八)

文章目录 十、新闻管理模块设计开发1、新闻管理主页面设计1.1 基本架构搭建1.1.1 搜索表单1.1.2 新闻主表格样式(静态数据模拟渲染)1.2 新闻分类选择框1.2.1 新建组件1.2.2 页面中导入渲染1.2.3 调用接口,动态渲染下拉分类,设计成 v-model 的使用方式1.2.4 父组件定义参数绑定…

共建智能座舱AI应用生态 夸克合作斑马智行开拓AI搜索新场景

近日,在2024云栖大会上,夸克与斑马智行达成合作,将面向汽车座舱场景,为用户打造专属AI新体验。夸克以AI搜索为中心的一站式AI服务融入座舱数字化生态,进一步拓展使用场景和能力边界。 9月20日,斑马智行发布…

【Geoserver使用】REST API调用(工作空间部分)

文章目录 前言一、Geoserver REST API(GeoServer Workspace)二、GeoServer Workspace接口使用1.GET请求 /workspaces2.POST请求 /workspaces3.GET请求 /workspaces/{workspaceName}4.PUT /workspaces/{workspaceName}5.DELETE /workspaces/{workspaceName} 总结 前言 根据Geos…

【Day20240924】联邦学习中的方法 改进

文章目录 前言一、FedAvg二、FedProx三、MOON四、FedDyn五、FedAsync六、PORT七、ASO-Fed八、FedBuff九、FedSA 前言 几种异步的方法: FedAsync PORT ASO-Fed FedBuff FedSA 几种同步的方法: FedAvg FedProx MOON FedDyn 一、FedAvg FedAvg基本步骤&a…

MySQL 中存储过程参数的设置与使用

《MySQL 中存储过程参数的设置与使用》 在 MySQL 数据库中,存储过程是一组预先编译好的 SQL 语句集合,可以接受参数并返回结果。使用存储过程可以提高数据库的性能和可维护性,同时也可以减少网络流量和代码重复。那么,如何在 MyS…

UEFI EDK2框架学习 (一)

01 Shell界面打印 执行qemu指令后 qemu-system-x86_64 -drive ifpflash,formatraw,fileOVMF.fd -nographic -net none出现shell界面 02 在UEFI shell中创建APP 创建SimplestApp文件夹以及SimplestApp.c、SimplestApp.inf cd edk2 mkdir SimplestAppuuidgen // generate …

ABB 机器人与 Profinet 转 EthernetIP 网关的高效连接

Profinet转EthernetIP网关在工业自动化领域发挥着至关重要的作用。它主要的功能就是实现不同网络协议之间的数据交互,为各种设备的连接与协同工作搭建了桥梁。 以连接ABB机器人为例,Profinet转EthernetIP网关能够将ABB机器人高效地接入到不同的网络系统…

transformer模型写诗词

加入会员社群,免费获取本项目数据集和代码:点击进入>> 1. 项目简介 该项目是基于A035-transformer模型的诗词生成系统,旨在通过深度学习技术实现古诗词的自动化创作。项目的背景源自当前自然语言处理领域的迅速发展,特别是…

工业交换机故障快速排查的方法有哪些

在现代工业自动化的环境中,工业交换机作为网络连接的重要设备,其稳定性和可靠性至关重要。然而,实际使用过程中难免会遇到各种故障,这对生产线和系统的正常运作造成了影响。为了有效应对这些问题,下面将介绍一些工业交…

第P8周:YOLOv5-C3模块实现

本文为🔗365天深度学习训练营 中的学习记录博客原作者:K同学啊 本次将利用YOLOv5算法中的C3模块搭建网络。 我的环境: ●操作系统:ubuntu 22.04 ●GPU显卡:RTX 3090(24GB) * 1 ●语言环境:python 3.12.3 ●编译器&…

鸿蒙开发的基本技术栈及学习路线

随着智能终端设备的不断普及与技术的进步,华为推出的鸿蒙操作系统(HarmonyOS)迅速引起了全球的关注。作为一个面向多种设备的分布式操作系统,鸿蒙不仅支持手机、平板、智能穿戴设备等,还支持IoT(物联网&…