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
猜你喜欢
- WordPress可以改造成twitter一样的微博网站,但是有一个坏处就是你要么用来做博客要么用来做微博,功能难兼得。相信大家在访问一些知
- 本文将演示如何使用SQL 7.0服务器的Enterprise Manager创建、配置一个示例数据库。我们还会演示如何增加具有合适权限的用户
- 之前在《首都机场的点烟器》中分析了一个软件系统所处的状态并且列举了不同的状态所需要的展示给用户的各类信息,我们先简单回顾一下:要设计一个软件
- PDO::_constructPDO::_construct — 创建一个表示数据库连接的 PDO 实例(PHP 5 >= 5.1.0
- PDOStatement::fetchObjectPDOStatement::fetchObject — 获取下一行并作为一个对象返回。(P
- 一、增强的可扩展性 Oracle9i Real Application Clusters是Oracle的下一代并行服务器系列产品。Oracl
- MySQL是关系型数据库中的明星,MongoDB是文档型数据库中的翘楚。下面通过一个设计实例对比一下二者:假设我们正在维护一个手机产品库,里
- 使用字符串第二次世界大战促使了现代电子计算机的诞生,当初的想法很简单,就是用计算机来计算导弹的弹道,因此在计算机刚刚诞生的那个年代,计算机处
- 介绍:细处着手,巧处用功。高手和菜鸟之间的差别就是:高手什么都知道,菜鸟知道一些。电脑小技巧收集最新奇招高招,让你轻松踏上高手之路。摘要:
- 我们可能会出现这种情况,某个表原来设计不周全,导致表里面的数据数据重复,那么,如何对重复的数据进行删除呢?重复的数据可能有这样两种情况,第一
- Go 中接口也是一个使用得非常频繁的特性,好的软件设计往往离不开接口的使用,比如依赖倒置原则(通过抽象出接口,分离了具体实现与实际使用的耦合
- 我们可用正规表达式来寻找并替换URL和邮件地址为活动的超级链接。用到的主要函数就是InsertHyperlinks(inText),语法为:
- 1. 规范简介本规范主要规定ASP源程序在书写过程中所应遵循的规则及注意事项。编写该规范的目的是使项目开发人员的源代码书写习惯保持一致。这样
- 第三章 XML的术语提纲:导言 一.XML文档的有关术语 二.DTD的有关术语导言初学XML最令人头疼的就是有一大堆新的术语概念要理解。由于
- 本文实例讲述了Python基于回溯法子集树模板解决野人与传教士问题。分享给大家供大家参考,具体如下:问题在河的左岸有N个传教士、N个野人和一
- 在计算机中数据有两种特征:类型和长度。所谓数据类型就是以数据的表现方式和存储方式来划分的数据的种类。在SQL Server 中每个变量、参数
- 一个Javascript 的类库,用于table内容排序。使用很方便,不用每次都去调用数据库了。特别适合多表查询的排序。加上<tbod
- 本文实例讲述了php中debug_backtrace、debug_print_backtrace和匿名函数用法。分享给大家供大家参考。具体分
- 原本运行正常的ASP页面,今天突然提示: 代码如下: Microsoft VBScript 运行时错误 错误 '800a01a8&
- 优秀的Stoyan Stefanov在他的新书中(《Javascript Patterns》)介绍了很多编写高质量代码的技巧,比如避免使用全