Python命令行参数化的四种方式详解
本文详细解析Python中构建命令行参数的四种常见方式:内置sys.argv、argparse、getopt以及第三方库click。通过对比各模块的特性、适用场景及代码示例,帮助开发者根据项目需求选择最合适的参数处理方案,从简单脚本到复杂生产环境均有对应最佳实践。
在日常开发Python脚本时,通常需要通过命令行传入变量参数,以提升项目的灵活性与易用性。
本文将系统梳理Python中构建命令行参数的四种主流方法。
具体包括以下四种方案:
- 内置sys.argv模块
- 内置argparse模块
- 内置getopt模块
- 第三方依赖库click
1. sys.argv
实现命令行参数最简单且常见的方式是利用内置的「sys.argv」模块。
该模块将参数作为有序列表传入,因此使用时传参顺序必须固定。
这种方式适用于参数数量较少且使用场景固定的项目。
import sys
if __name__ == '__main__':
# 获取参数列表
# 注意:sys.argv[0] 代表第一个参数,即:脚本名称「1_sys.argv.py」
# 其他参数列表
args = sys.argv[1:]
# 参数个数
args_length = len(sys.argv) if sys.argv else 0
print("排除运行主文件参数,其他参数列表为:", args)
print("参数总数:", args_length)
# 使用
# python3 1_sys.argv.py arg1 arg2
# 排除运行主文件参数,其他参数列表为: [arg1, arg1]
# 参数总数:3
需注意,通过「sys.argv」获取的参数列表中,索引为0的第一个参数代表脚本的主文件名。
2. argparse
内置的argparse模块能够轻松编写出友好的命令行参数脚本,并自动生成帮助手册。当用户传入无效参数时,它还能抛出清晰的错误信息。
官方文档
使用argparse构建命令行参数主要包含3个步骤:
构建参数解析对象、添加参数、解析参数。
1. 构建命令行参数解析对象
import argparse
...
# 构建一个命令行参数解析对象
parser = argparse.ArgumentParser(description='命令行参数')
...
2. 添加命令行参数
需注意,--arg1用于指定参数名称,而-a1代表dest目标变量值(即简写形式)。
...
# 设置3个参数
# 参数1:arg1,整型,非必须传入参数
# 参数2:arg2,字符串,非必须传入参数,包含默认值「xag」
# 参数3:arg3,字符串类型,必须传入的参数
parser.add_argument('--arg1', '-a1', type=int, help='参数1,非必须参数')
parser.add_argument('--arg2', '-a2', type=str, help='参数2,非必须参数,包含默认值', default='xag')
parser.add_argument('--arg3', '-a3', type=str, help='参数3,必须参数', required=True)
...
3. 解析出参数值
...
# 解析参数,获取所有的命令行参数(Namespace),然后转为字典
args = vars(parser.parse_args())
# 获取所有参数
print("所有命令行参数为:")
for key in args:
print(f"命令行参数名:{key},参数值:{args[key]}")
...
使用时,可以通过「-h / --help」命令参数查看帮助文档。
# 查看命令行参数帮助文档
python3 2_argparse.py --help
# 或
python3 2_argparse.py -h上述示例中添加了3个参数:arg1和arg2为非必须传值,其中arg2指定了默认值;arg3为必须传值。
# 参数arg3必须,参数arg1和参数arg2非必须,其中参数arg2设置了默认值
# 传入参数arg3
# python3 2_argparse.py --arg3 123
# python3 2_argparse.py -a3 123
xingag@xingagdeMacBook-Pro args % python3 2_argparse.py -a3 123
所有命令行参数为:
命令行参数名:arg1,参数值:None
命令行参数名:arg2,参数值:xag
命令行参数名:arg3,参数值:123
# 传入参数arg1、arg3
xingag@xingagdeMacBook-Pro args % python3 2_argparse.py -a1 111 -a3 123
所有命令行参数为:
命令行参数名:arg1,参数值:111
命令行参数名:arg2,参数值:xag
命令行参数名:arg3,参数值:123
# 传入参数arg1、arg2、arg3
xingag@xingagdeMacBook-Pro args % python3 2_argparse.py -a1 111 -a2 222 -a3 123
所有命令行参数为:
命令行参数名:arg1,参数值:111
命令行参数名:arg2,参数值:222
命令行参数名:arg3,参数值:123
3. getopt
getopt是Python内置的标准模块,可结合sys.argv模块直接解析脚本运行时的参数。
使用格式:getopt(args,shortopts,longopts = [])
其中各参数含义如下:
args
参数列表,可通过sys.argv获取,参考上文示例。
shortopts
短参数组成的字符串。定义短参数时,若参数需要接收值,需在短参数后追加一个「:」符号。
传参使用方式示例:-n 23
longopts
长参数列表。定义长参数时,若某个参数需要接收值,需在参数名后追加一个「=」符号。
传参使用方式示例:--port 8080
此处以传入数据库连接参数(包含ip、用户名、密码、数据库名称)为例进行讲解。
from getopt import getopt
import sys
# 获取参数
# sys.argv[1:]:获取除脚本文件名外的所有命令行参数
# opts:存有所有选项及其输入值的元组列表
# args:去除有用的输入以后剩余的部分
opts, args = getopt(sys.argv[1:], 'i:u:p:d:', ['ip=', 'user=', 'pwd=', 'db='])
# 获取参数值
# 短参数
# python3 4_getopt.py -i 127.0.0.1 -u root -p 123456 -d mysqldb
# 长参数
# python3 4_getopt.py --ip 127.0.0.1 -u root -p 123456 -d mysqldb
ip_pre = [item[1] for item in opts if item[0] in ('-i', '--ip')]
ip = ip_pre[0] if len(ip_pre) > 0 else None
print("参数ip:", ip)
user_pre = [item[1] for item in opts if item[0] in ('-u', '--user')]
user = user_pre[0] if len(user_pre) > 0 else None
print("参数user:", user)
pwd_pre = [item[1] for item in opts if item[0] in ('-p', '--pwd')]
pwd = pwd_pre[0] if len(pwd_pre) > 0 else None
print("参数pwd:", pwd)
db_pre = [item[1] for item in opts if item[0] in ('-d', '--db')]
db = db_pre[0] if len(db_pre) > 0 else None
print("参数db:", db)
运行脚本时,可利用「短参数」或「长参数」形式进行传递。
# 测试
# 短参数
python3 4_getopt.py -i 127.0.0.1 -u root -p 123456 -d mysqldb
# 长参数
python3 4_getopt.py --ip 127.0.0.1 --user root --pwd 123456 --db mysqldb
4. click
click作为第三方依赖库,为命令行工具封装了大量方法,可非常方便地实现命令行参数处理。
项目地址
首先,需要安装依赖库click。
import click
# 安装依赖
# pip3 install -U click
@click.command()
@click.option('--arg1', default='111', help='参数arg1,默认值为「111」')
@click.option('--arg2', type=int, help='参数arg2')
@click.option('--arg3', type=str, help='参数arg3')
def start(arg1, arg2, arg3):
"""
基于参数arg1、参数arg2、参数arg3运行项目
:param arg1:
:param arg2:
:param arg3:
:return:
"""
print("参数arg1值为:", arg1)
print("参数arg2值为:", arg2)
print("参数arg3值为:", arg3)
if __name__ == '__main__':
start()
随后,在主运行函数上通过装饰器配置参数即可。
例如,上述代码定义了3个命令行参数arg1、arg2、arg3,并设置了参数的类型及默认值。
最后,运行脚本时只需按参数设定传递对应的值即可。
# 不包含参数
xingag@xingagdeMacBook-Pro args % python3 3_click.py
参数arg1值为: 111
参数arg2值为: None
参数arg3值为: None
# 包含参数arg1
xingag@xingagdeMacBook-Pro args % python3 3_click.py --arg1 test1
参数arg1值为: test1
参数arg2值为: None
参数arg3值为: None
# 包含参数arg1、arg2
# 注意:arg2的参数类型为整形,传入的参数必须能转为整形,否则会报错
xingag@xingagdeMacBook-Pro args % python3 3_click.py --arg1 test1 --arg2 222
参数arg1值为: test1
参数arg2值为: 222
参数arg3值为: None
# 包含参数arg1、arg2、arg3
xingag@xingagdeMacBook-Pro args % python3 3_click.py --arg1 test1 --arg2 222 --arg3 test3
参数arg1值为: test1
参数arg2值为: 222
参数arg3值为: test3
总结
上文通过实例讲解了实现Python命令行参数的4种常见方式。
对于简单自用且非正式的场景,建议考虑使用sys.argv模块快速构建命令行参数;而对于参数较多、面向用户的正式生产环境,建议使用argparse模块或click依赖库来创建命令行参数。
到此这篇关于Python命令行参数化的四种方式详解的文章就介绍到这了,更多相关Python命令行参数化内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









