Python命令行参数构建指南:4种常见方式详解与使用技巧
↑ 关注 + 星标 ,每天学Python新技能
后台回复【大礼包】送你Python自学大礼包 1. 前言
在日常编写 Python 脚本时,我们时常需要将命令行参数与一些变量参数相结合,这样能让项目的使用变得更加灵活且方便。
我将在本篇文章中罗列出构建 Python 命令行参数的 4 种常见方式。
它们分别是:
2.sys.argv
构建命令行参数的最简单且常见的方式是借助内置的“sys.argv”模块。
它会把参数以一个有序的列表的形式传入。因此,在使用的时候,传参的顺序必须是固定的。
因此,这种方式适用于参数个数少且场景固定的项目中
import sys
if __name__ == '__main__':
# 获取参数列表
[id_136661874] 注意:sys.argv[0] 所代表的是第一个参数,其具体内容为脚本名称「1_sys.argv.py」。
# 其他参数列表
args = sys.argv[1:]
# 参数个数
获取命令行参数的长度,将其赋值给变量 args_length,这里的命令行参数长度通过计算 sys.argv 的长度得到。if sys.argv else 0
print("排除运行主文件参数,其他参数列表为:", args)
print("参数总数:", args_length)
# 使用
在 Python3 中,有一个名为 sys.argv.py 的文件,它接受两个参数 arg1 和 arg2 。
排除运行主文件的参数,其他参数的列表是:[arg1, arg1]
# 参数总数:3在脚本中,通过“sys.argv”获取的参数列表里,第一个参数表示脚本主文件名称。
3. argparse
内置的 argparse 模块能够很容易地编写友好的命令行参数脚本,它还能自动生成使用手册,当用户给程序传入无效参数时,会抛出清晰的错误信息。
[id_1111272984]
使用它构建命令行参数包含 3 个步骤:
构建参数解析对象添加参数
添加参数
解析参数
3-1 构建命令行参数解析对象
import argparse
...
# 构建一个命令行参数解析对象
parser 被创建为一个 argparse.ArgumentParser 对象,其描述为:'命令行参数')
...
3-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-3 解析出参数值
...
解析参数,获取所有的命令行参数,这些参数是以 Namespace 的形式存在的,接着将其转为字典。
通过 vars 函数获取 parser.parse_args() 的结果并赋值给 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 也无需必须传值,而参数 arg3 必须传值。并且,参数 arg2 有指定的默认值。
参数 arg3 是必须的,参数 arg1 不是必须的,参数 arg2 也不是必须的。并且参数 arg2 设置了默认值。
# 传入参数arg3
使用 python3 运行 2_argparse.py 并传入参数 --arg3 ,其值为 123 。
python3 运行 2_argparse.py 并传入参数 -a3 和 123 。
在 xingag 的 MacBook-Pro 上执行命令,使用 python3 并传入 args 参数。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
4. getopt
getopt 是 Python 中的一个内置标准模块。它可以与 sys.argv 模块相结合。能够直接对脚本运行时的参数进行解析。
使用 getopt 函数,传入参数 args、短选项 shortopts 以及长选项 longopts(可为空列表)
其中
这里以传入数据库连接参数的情况为例,该参数包含 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 ,设置用户名为 root ,设置密码为 123456 ,设置数据库名为 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
5. click
click 作为第三方依赖库,它为命令行工具进行了大量方法的封装,能够非常便捷地实现命令行参数。
项目地址:
首先,我们需要安装依赖库click
import click
# 安装依赖
# pip3 install -U click
@click.command()
@click.option 有一个名为 '--arg1' 的参数,其默认值为 '111',并且该参数的帮助信息为「参数 arg1,默认值为「111」」
点击.选项('--arg2', 类型为整数, 帮助为'参数 arg2')
使用 @click.option 来设置参数 arg3,其类型为 str,并且提供了关于参数 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 上使用参数执行 python3 3_click.py 命令。
参数arg1值为: 111
参数arg2值为: None
参数arg3值为: None
# 包含参数arg1
xingag 在 xingagdeMacBook-Pro 中使用以下命令:python3 3_click.py --arg1 test1
参数arg1值为: test1
参数arg2值为: None
参数arg3值为: None
# 包含参数arg1、arg2
注意:arg2 的参数类型是整形。传入的参数必须能够被转为整形,不然就会报错。
xingag 在 xingagdeMacBook-Pro 上执行命令,使用 python3 运行 3_click.py 脚本,并传入参数 --arg1 为 test1 和 --arg2 为 222 。
参数arg1值为: test1
参数arg2值为: 222
参数arg3值为: None
# 包含参数arg1、arg2、arg3
xingag 在 xingagdeMacBook-Pro 上执行命令,使用 python3 运行 3_click.py 脚本,并传入参数 --arg1 为 test1、--arg2 为 222、--arg3 为 test3
参数arg1值为: test1
参数arg2值为: 222
参数arg3值为: test3
6. 最后
通过实例讲解了以下内容:实现了 Python 命令行参数的常见方式,且这种方式共有 4 种。
对于一些简单自用且不太正规的场景,个人认为可以考虑借助 sys.argv 模块来快速搭建命令行参数。对于一些参数较多且面向用户的正式生产环境,建议通过 argparse 模块或者 click 依赖来创建命令行参数。
