Python实现解析命令行参数的常见方法总结
作者:玩转测试开发 发布时间:2023-10-15 12:31:49
简介
除ide的执行方式外,命令行的方式执行Python脚本是参数化程序执行的一种常见且简单的方法,正确处理命令行参数,可以提供给包含某种参数化信息的程序或脚本的参数。例如处理目录或者文件通常作为命令行参数传递给脚本,用于使程序可以处理不同图片或者不同类型文件。
基本形式
python main.py -a v1 -b v2 ...
3种常见的获取和解析命令行参数的方法
1、sys.argv
2、getopt
3、argparse
sys.argv案例
1、sys.argv返回一个列表,第一个值为脚本名称,列表的值类型为string。
2、参数数量:len(sys.argv)
3、获取全部参数:sys.argv
案例源码1
# -*- coding: utf-8 -*-
# time: 2022/9/1 0:10
# file: args_demo.py
# 公众号: 玩转测试开发
import sys
def f1():
print(f"正在运行的脚本名称: {sys.argv[0]}")
print(f"脚本的参数数量: {len(sys.argv)}")
print(f"脚本的参数: {sys.argv}")
if __name__ == '__main__':
f1()
执行结果:
getopt案例:getopt 模块是专门处理命令行参数的模块,用于获取命令行选项和参数。命令行选项使得程序的参数更加灵活,其支持短选项模式(-)和双-选项模式(--)。该模块提供了两个方法及一个异常处理来解析命令行参数。
语法格式:
getopt.getopt(args, options[, long_options])
参数说明:
args:要解析的命令行参数列表,一般是sys.argv[1:],需要过滤掉脚本名(sys.argv[0])
options:以字符串的格式定义,options 后的冒号 “:” ,表示如果设置该选项,必须有附加的参数,否则就不附加参数
long_options:以列表的格式定义,long_options 后的等号 “=” ,表示该选项必须有附加的参数,不带冒号表示该选项不附加参数
案例源码2
# -*- coding: utf-8 -*-
# time: 2022/9/1 0:10
# file: args_demo.py
# 公众号: 玩转测试开发
import sys
import getopt
def f1():
print(f"正在运行的脚本名称: {sys.argv[0]}")
print(f"脚本的参数数量: {len(sys.argv)}")
print(f"脚本的参数: {sys.argv}")
def f2(argv):
input_file = ""
output_file = ""
opts, args = getopt.getopt(argv[1:], "hi:o:", ["help", "input_file=", "output_file="])
# "hi:o:": 短格式分析串, h 后面没有冒号, 表示后面不带参数; i 和 o 后面带有冒号, 表示后面带参数
# ["help", "input_file=", "output_file="]: 长格式分析串列表, help后面没有等号, 表示后面不带参数; input_file和output_file后面带冒号, 表示后面带参数
# 返回值包括 `opts` 和 `args`, opts 是以元组为元素的列表, 每个元组的形式为: (选项, 附加参数),如: ('-i', 'test.png');
# args是个列表,其中的元素是那些不含'-'或'--'的参数
for opt, arg in opts:
if opt in ("-h", "--help"):
# 即:处理 -h参数的案例说明,帮助文档等
print('args_demo.py -i <input_file> -o <output_file>')
print('or: args_demo.py --input_file=<input_file> --output_file=<output_file>')
sys.exit()
elif opt in ("-i", "--input_file"):
input_file = arg
elif opt in ("-o", "--output_file"):
output_file = arg
print(f'输入文件为:{input_file}')
print(f'输出文件为:{output_file}')
# 打印不含'-'或'--'的参数
for i in range(0, len(args)):
print(f'不含 - 或 -- 的参数 {i + 1} 为:{args[i]}')
if __name__ == '__main__':
# f1()
f2(sys.argv)
命令行依次执行:
python args_demo.py -h
python args_demo.py -i a.txt
python args_demo.py -o b.txt
python args_demo.py -i a.txt -o b.txt c.txt
执行结果:
Exception getopt.GetoptError:在参数列表中没有找到所传递参数,或选项的需要的参数为空时会触发该异常。异常的参数是一个字符串,表示错误的原因。属性 msg 和 opt 为相关选项的错误信息。在上述代码中添加异常处理,检查此错误信息。
使用错误的格式选项传递参数执行脚本:python args_demo.py -q
argparse案例:当程序中使用采用复杂参数或多个文件名时,推荐使用 Python 的 argparse 库,它以系统的方式处理命令行参数,从而可以编写用户友好的命令行程序。Python 标准库 argparse 同样也是用于解析命令行参数的模块。首先,由程序确定所需的参数,然后 argparse 将这些参数解析为 sys.argv。此外,argparse 会生成帮助和使用信息提示,并在提供无效参数时发出错误。为了介绍此模块,编写 argparse_demo1.py,如下所示:
为了介绍此模块,编写 argparse_demo1.py,如下所示:
案例1
不带参数运行此脚本不会向 stdout 显示任何内容。但是,如果使用 --help 或 -h 选项,将得到脚本的使用信息提示
import argparse
parser = argparse.ArgumentParser()
parser.parse_args()
执行结果:
(venv)>python argparse_demo.py -h
usage: argparse_demo.py [-h]
optional arguments:
-h, --help show this help message and exit
(venv)>python argparse_demo.py --help
usage: argparse_demo.py [-h]
optional arguments:
-h, --help show this help message and exit
案例2
指定其他参数会导致错误python argparse_demo.py -q
python argparse_demo.py -q
usage: argparse_demo.py [-h]
argparse_demo.py: error: unrecognized arguments: -q
案例3
添加一个参数需要调用方法 parser.add_argument
# -*- coding: utf-8 -*-
# time: 2022/8/31 16:20
# file: argparse_demo1.py
# author: tom
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("name", help="添加的第1个参数name,姓名。")
args = parser.parse_args()
print(f"args.name:{args.name}")
print(f"type:{type(args.name)}")
使用范例:
python argparse_demo1.py tom
python argparse_demo1.py -h
python argparse_demo1.py
执行结果:此时不带参数运行脚本则抛出缺少参数name
(venv) >python argparse_demo.py tom
args.name:tom
type:<class 'str'>
(venv) >python argparse_demo.py -h
usage: argparse_demo.py [-h] name
positional arguments:
name 添加的第1个参数name,姓名。
optional arguments:
-h, --help show this help message and exit
(venv) >python argparse_demo.py
usage: argparse_demo.py [-h] name
argparse_demo.py: error: the following arguments are required: name
使用--的形式:使用-的形式则--name改成 -name即可。
案例4
argparse 将提供的选项默认视为字符串,新增int类型的案例
# -*- coding: utf-8 -*-
# time: 2022/8/31 16:20
# file: argparse_demo1.py
# author: tom
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--name", help="添加的第1个参数name,姓名。")
parser.add_argument("--age", help="添加的第2个参数age,年龄。", type=int)
args = parser.parse_args()
print(f"args.name:{args.name}")
print(f"type:{type(args.name)}")
print("*" * 50)
print(f"args.age:{args.age}")
print(f"type:{type(args.age)}")
使用范例:可使用两种形式 --key=value / --key value
python argparse_demo.py --name=tom --age=30
python argparse_demo.py --name tom --age 30
执行结果:
(venv) >python argparse_demo.py --name=tom --age=30
args.name:tom
type:<class 'str'>
**************************************************
args.age:30
type:<class 'int'>
(venv) >python argparse_demo.py --name tom --age 30
args.name:tom
type:<class 'str'>
**************************************************
args.age:30
type:<class 'int'>
来源:https://mp.weixin.qq.com/s/JNURdh-3BKV6QQnC7p0luQ
猜你喜欢
- 这篇文章主要介绍了Python如何使用Gitlab API实现批量的合并分支,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的
- 定时任务:1、 线程睡眠函数 sleep() ——粗暴!一直占有 CPU 资源,导致后续操作无法执行2、 threading.Timer(1
- 时间库—arrow使用背景日期时间处理在实际应用场景中无处不在,所以这也成了编程语言中必不可少的模块,Python 也不例外。但是,你知道在
- 逐步指示这是提供给更喜欢阅读的人的视频文本版本。我们将创建一个类似黑客新闻 或Reddit的社交新闻网站。它将被称为“钢铁传闻”,作为一个分
- CentOS6.9安装Mysql5.7,供大家参考,具体内容如下一、上传安装包二、建立用户以及mysql的目录1、建立一个mysql的组输入
- (高手就不要笑话了^_^)。好了,其他的不说现在就开始:select 子句主要决定了从表中取出的列名,列数以及列的显示顺序等信息,"
- 在实用美术中,常有"远看色彩近看花,先看颜色后看花,七分颜色三分花"的说法。这也就说明,在任何设计中,色彩对视觉的刺激起
- Seconds_Behind_Master对于mysql主备实例,seconds_behind_master是衡量master与slave之
- 前言今天查询一个数据字段一直提示字符无效,明明在数据库表字段中是存在的;查询后得知,数据库表字段为小写时,查询需要将字段名小写并加上双引号;
- yield的功能类似于return,但是不同之处在于它返回的是生成器。生成器生成器是通过一个或多个yield表达式构成的函数,每一个生成器都
- transpose() 这个函数如果括号内不带参数,就相当于转置,和.T效果一样,而今天主要来讲解其带参数。我们看如下一个numpy的数组:
- 本文实例为大家分享了python统计序列中元素的具体代码,供大家参考,具体内容如下问题1: &
- 最近做的一个项目对日期时间的处理比较多,最后整理到一个工具类里面,方便以后使用:1. 在utils文件夹下新建一个dateTimeUtil.
- hp中怎么让json_encode不自动转义斜杠“/”?下面本篇文章给大家介绍一下PHP中让json_encode不自动转义斜杠“/”的方法
- 当然首先得去下载ASPupload 程序,安装后使用!官方网站下载:http://www.aspupload.com/使用ASP实现文件上载
- 另外他们列出的这些区别有些是蛮有意义的,有些可能由于他们本人的MySQL DBA的身份,对Oracle的理解有些偏差,有些则有凑数的嫌疑.
- getpwname只能得到gid一个username。import pwdmyGroupId = pwd.getpwnam(username
- 出自: 编程中国 http://www.bc-cn.net作者: 天涯听雨 &nbs
- 事件是javascript中的核心内容之一,在对事件的应用中不可避免的要涉及到一个重要的概念,那就是事件冒泡,在介绍事件冒泡之前,先介绍一下
- 简单的‘Hello World!'Python命令行假设你已经安装好了Python, 那么在Linux命令行输入:$python将直