前言:
国内对于argparse模块的教程还是挺多的,但是大部分都是不适合初学者的,所以我自己整理了一下,以个人见解来写这篇文章,说的不对的地方还请纠正。
1、模块简介
argparse模块使编写脚本程序的命令行传参变得更加灵活。该程序定义了所需的参数,argparse 并将找出如何解析这些参数sys.argv。argparse 当用户为程序提供无效参数时,该模块还会自动生成帮助和使用情况消息并发出错误。
2、场景设计
在linux中,大部分软件在执行的时候都会出现一些帮助命令,要求在执行的时候传入相关的参数,就拿最常见的MySQL来说,我们在登录数据库的时候都是需要指定一个用户名进行登录,也就是-u参数,当你不使用-u的时候,程序会提示一些报错信息,要求你输入,像这样的程序可以让使用者更加的容易上手,退一步讲,我们在编写相关脚本的时候,也会需要以传参的方式去运行一个完整的程序/脚本。
3、实践操作
例如我设置一个检查文件是否存在的函数,通过传参的方式获取需要判断的文件,此时需要在源码上进行参数的设置才能运行,这样就显得不够方便。
3.1、文件判断案例,函数传参
通过函数调用传参(源码级别)
import os
def check_file(file):
if os.path.exists(file):
if os.path.isfile(file):
print("[%s]是一个文件" %file)
check_file(file='file.py')
那么如何实现执行脚本的时候就直接传入参数呢?一般情况下可以采取下面的方式:
import os
import sys
def check_file(file):
if os.path.exists(file):
if os.path.isfile(file):
print("[%s]是一个文件" %file)
else:
print("找不到文件:【%s】" %file)
file = sys.argv[1]
check_file(file=file)
虽然说这个方式能实现参数的传入,但是相对来说,如果需要传入的参数有多个,并且有些需要必须设置,有些是可选参数的时候就让其他使用的人不太友好了,例如:
3.2、登录功能案例,sys.argv传参
该函数通过传参的方式打印用户登录信息 (可以改成其他功能)
import sys
def login(user,password,host):
print("用户名设置为:",user)
print("密码设置为:",password)
print("设置的主机地址:",host)
user = sys.argv[1]
password = sys.argv[2]
host = sys.argv[3]
login(user=user, password=password, host=host)
虽然这样能够实现不修改源码就可以传入对应的参数,但是这样只能按照设定的顺序进行传参,而且没有参数传入的相关帮助,所以这时候就需要用到argparse模块了。
4、B格更高的argparse传参
案例依旧采用登录的功能进行改造,改造源码如下:
import argparse
def main():
#all_info :接收所有传入的信息
all_info = argparse.ArgumentParser(description="设置登录信息")
all_info.add_argument('-u','--user', required=True)
all_info.add_argument('-p','--password', required=True)
all_info.add_argument('-H','--host',required=True)
all = all_info.parse_args()
print("传入的所有信息(命名空间)如下:", all)
##下面开始拆分信息,all.xxx中,xxx为上面定义的--后面的字符串
name = all.user
password = all.password
Host = all.host
print("用户名:[%s]\n密码:[%s]\n主机:[%s]\n" %(name,password,Host))
if __name__ == '__main__':
main()
运行语句:
python3 file.py -u liuyi -p 000000 -H localhost
运行结果:
然后换个姿势,调整传入的顺序:
python3 file.py -u liuyi -H localhost -p the_is_pass
参数,打印结果依旧一致,没有出现乱套的现象,完美!对于argparse的更多使用方式,将在下一篇专门讲解!