当前位置: 首页 > 科技观察

说说Python命令行参数化的几种方法!_0

时间:2023-03-20 10:52:44 科技观察

在日常编写Python脚本的过程中,我们经常需要结合命令行参数传入一些可变参数,使项目使用起来更加灵活方便。在本文中,我将列出四种构造Python命令行参数的常用方法。它们是:内置sys.argv模块内置argparse模块内置getopt模块第三方依赖库click1。sys.argv构造命令行参数最简单和常用的方法是使用内置的“sys.argv”模块。它以有序列表的形式传递参数,因此使用时必须固定传递参数的顺序。因此,这种方式适用于参数数量较少、场景固定的项目:importsysif__name__=='__main__':#获取参数列表#注:sys.argv[0]代表第一个参数,即:脚本名称”1_sys.argv.py"#其他参数列表args=sys.argv[1:]#参数个数args_length=len(sys.argv)ifsys.argvelse0print("排除运行主文件参数,其他参数列表为:",args)print("Totalnumberofparameters:",args_length)#Use#python31_sys.argv.pyarg1arg2#排除运行主文件参数,其他参数列表为:[arg1,arg1]#参数总数:3required注意在脚本中通过“sys.argv”获取的参数列表中,第一个参数代表脚本的主文件名。2、argparse内置的argparse模块,可以轻松编写友好的命令行参数脚本,自动生成帮助手册,当用户向程序传递无效参数时可以抛出明确的错误信息。官方文档:https://docs.python.org/zh-cn/3.10/library/argparse.html使用它构建命令行参数分为3个步骤:构建参数解析对象添加参数添加参数解析参数(1)构建commandsLineparameterparsingobjectimportargparse...#构建命令行参数解析对象parser=argparse.ArgumentParser(description='commandlineparameter')...(2)添加命令行参数需要指出的是——arg1用于指定参数名,-a1表示dest目标变量值(简写)...#设置3个参数#参数1:arg1,整数,非必填参数#参数2:arg2,字符串,非必填参数,包括默认值"xag"#参数3:arg3,字符串类型,必须在参数parser.add_argument('--arg1','-a1',type=int,help='parameter1,not必填参数')parser.add_argument('--arg2','-a2',type=str,help='parameter2,非必填参数,包括defaultvalue',default='xag')parser.add_argument('--arg3','-a3',type=str,help='parameter3,requiredparameter',required=True)...(3)解析参数值...#解析参数并获取所有命令行参数(Namespace),然后转换为字典args=vars(parser.parse_args())#获取所有参数print("所有命令行参数为:")forkeyinargs:print(f"命令行参数名:{key},参数值:{args[key]}")...在使用的??时候,我们可以通过"-h/--help》命令参数:#查看命令行参数帮助文档python32_argparse.py--help#或者python32_argparse.py-h上面添加的3个参数,参数arg1和arg2不需要传值,arg3必须传values,参数arg2指定默认值:#参数arg3是必须的,参数arg1和参数arg2不是必须的,其中参数arg2设置默认值#传入参数arg3#python32_argparse.py--arg3123#python32_argparse.py-a3123xingag@xingagdeMacBook-Proargs%python32_argparse.py-a3123所有命令行参数为:命令行参数名:arg1,参数值:Nonecommand行参数名:arg2,参数值:xag命令行参数名:arg3,参数值:123#传入参数arg1,arg3xingag@xingagdeMacBook-Proargs%python32_argparse.py-a1111-a3123所有命令行参数为:命令行参数名:arg1,参数值:111命令行参数名:arg2,参数值:xag命令行参数名:arg3,参数值:123#传入参数arg1,arg2,arg3xingag@xingagdeMacBook-Proargs%python32_argparse.py-a1111-a2222-a3123所有命令行参数为:命令行参数名:arg1,参数值:111命令行参数名:arg2,参数值:222命令行参数名:arg3,参数值:1233.getoptGetopt是Python中内置的标准模块。可以结合sys.argv模块直接解析脚本运行时的参数。格式:getopt(args,shortopts,longopts=[])。其中:(1)args:参数列表,可以通过sys.argv获取,可以参考上面(2)shortoptsshortparameterstring:定义一个短参数,如果参数有值,需要加上短参数后面加一个“:”符号传参方式:-n23(3)longopts长参数列表定义长参数列表时,如果某个参数有值,需要在后面加一个“=”符号传参方式短参数:--port8080这里以传入的数据库连接参数为例(参数包括ip、用户名、密码、数据库名)说明:fromgetoptimportgetoptimportsys#getparameters#sys.argv[1:]:获取除脚本文件名外的所有命令行参数#opts:包含所有选项及其输入值的元组列表#args:去除有用输入后的剩余部分opts,args=getopt(sys.argv[1:],'i:u:p:d:',['ip=','user=','pwd=','db='])#获取参数值#短参数#python34_getopt.py-i127.0.0.1-uroot-p123456-dmysqldb#长参数#python34_getopt.py--ip127.0.0.1-uroot-p123456-dmysqldbip_pre=[item[1]foriteminoptsifitem[0]in('-i','--ip')]ip=ip_pre[0]iflen(ip_pre)>0elseNoneprint("parameterip:",ip)user_pre=[item[1]foriteminoptsifitem[0]in('-u','--user')]user=user_pre[0]iflen(user_pre)>0elseNoneprint("parameteruser:",user)pwd_pre=[item[1]foriteminoptsifitem[0]in('-p','--pwd')]pwd=pwd_pre[0]iflen(pwd_pre)>0elseNoneprint("Parameterpwd:",pwd)db_pre=[item[1]foriteminoptsifitem[0]in('-d','--db')]db=db_pre[0]iflen(db_pre)>0elseNoneprint("parameterdb:",db)运行脚本时,我们可以使用“短参数”或“长参数”的形式传递:#test#短参数python34_getopt.py-i127.0.0.1-uroot-p123456-dmysqldb#长参数python34_getopt.py--ip127.0.0.1--userroot--pwd123456--dbmysqldb4.clickclick作为第三方依赖库,封装了大量命令行工具的方法,可以非常方便的实现命令行参数项目地址:https://pypi.org/project/click/。首先我们需要安装依赖库click:importclick#Installdependencies#pip3install-Uclick@click.command()@click.option('--arg1',default='111',help='parameterarg1,默认值为"111"')@click.option('--arg2',type=int,help='parameterarg2')@click.option('--arg3',type=str,help='parameterarg3')defstart(arg1,arg2,arg3):"""根据参数arg1,arg2,arg3运行项目:paramarg1::paramarg2::paramarg3::return:"""print("参数arg1的值为:",arg1)print("参数arg2的值为:",arg2)print("参数arg3的值为:",arg3)if__name__=='__main__':start()然后,在主运行函数上通过装饰器配置参数即可。例如,上面定义了三个命令行参数arg1、arg2、arg3,并设置了参数的类型和默认值。最后,在运行脚本时,只需要根据参数设置传递相应的值即可。#不包含参数xingag@xingagdeMacBook-Proargs%python33_click.pyparameterarg1value:111parameterarg2value:Noneparameterarg3value:None#包含参数arg1xingag@xingagdeMacBook-Proargs%python33_click.py--arg1test1的参数arg1的值是:test1的参数arg2的值是:None参数arg3的值是:None#包含参数arg1和arg2#注意:arg2的参数类型是整数,传入的参数必须是转换为整数,否则会报错xingag@xingagdeMacBook-Proargs%python33_click.py--arg1test1--arg2222参数arg1的值为:test1参数arg2的值为:222参数arg3的值为is:None#Containsparametersarg1,arg2,arg3xingag@xingagdeMacBook-Proargs%python33_click.py--arg1test1--arg2222--arg3test3参数arg1值:test1参数arg2值:222参数arg3值:test3最后,以上4种常见的Pyth实现方式命令行参数通过示例进行解释。对于一些简单的自用和不太正式的场景,个人认为可以考虑使用sys.argv模块快速构建命令行参数;而对于一些参数比较多、面向用户的官方生产环境,建议使用argparse模块或者点击dependencies来创建命令行参数