前言

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

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部