前言
命令行程序,也称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 文档