-
1. sys.argv
-
2. getopt
-
- 2.1 getopt.getopt 方法
-
2.2 Exception getopt.GetoptError
-
3. argparse
通常,对于大型项目程序而言,执行程序的一个必要的步骤是正确处理命令行参数,这些命令行参数是提供给包含某种参数化信息的程序或脚本的参数。例如,在计算机视觉项目中,图像和不同类型的文件通常作为命令行参数传递给脚本,用于使程序可以处理不同图片或者不同类型文件。
命令行参数是参数化程序执行的一种常见且简单的方法,下面主要介绍三种常见的获取和解析命令行参数的方法。
为了处理命令行参数,Python 中内置了 sys.argv
模块,通过模块中的 sys.argv
就可以访问到所有的命令行参数,它的返回值是包含所有命令行参数的列表 (list)。当程序执行时,Python 从命令行获取所有值并将它们存储在 sys.argv 列表中。列表的第一个元素 sys.argv[0]
是脚本的完整路径(或脚本名称——取决于具体操作系统)。列表的第二个元素是脚本的第一个命令行参数,即 sys.argv[1]
,依此类推。这可以通过下图中清晰的看出,其中 script_1.py
脚本使用两个参数执行:
接下来,让我们看看 sys.argv
是如何工作的,首先编写 scripy_1.py
脚本:
import sys
print(“正在运行的脚本名称: ‘{}’”.format(sys.argv[0]))
print(“脚本的参数数量: ‘{}’”.format(len(sys.argv)))
print(“脚本的参数: ‘{}’”.format(str(sys.argv)))
如果我们不使用任何参数执行这个脚本:
python script_1.py
将会看到如下信息:
正在运行的脚本名称: ‘script_1.py’
脚本的参数数量: ‘1’
脚本的参数: ‘[‘script_1.py’]’
如果我们使用多个参数执行此脚本:
python script_1.py OpenCV -i test.png
将得到以下信息:
正在运行的脚本名称: ‘script_1.py’
脚本的参数数量: ‘4’
脚本的参数: ‘[‘script_1.py’, ‘OpenCV’, ‘-i’, ‘test.png’]’
如上所示,列表的第一个元素 script_1.py (sys.argv[0]) 是脚本名称。列表的第二个元素 (sys.argv[1]) OpenCV 是脚本的第一个参数。但同时也可以看到,sys.argv 将命令行选项 -i
也识别为参数,这样并不能方便的满足我们的需求,因此引入 getopt
模块来识别命令行选项。
getopt
模块是专门处理命令行参数的模块,用于获取命令行选项和参数。命令行选项使得程序的参数更加灵活,其支持短选项模式(-)和长选项模式(–)。
该模块提供了两个方法及一个异常处理来解析命令行参数。
2.1 getopt.getopt 方法
getopt.getopt
方法用于解析命令行参数列表,其语法格式如下:
getopt.getopt(args, options[, long_options])
方法参数说明如下表所示:
| 参数 | 说明 |
| — | — |
| args | 要解析的命令行参数列表,一般是sys.argv[1:],需要过滤掉脚本名(sys.argv[0]) |
| options | 以字符串的格式定义,options 后的冒号 “:
” 表示如果设置该选项,必须有附加的参数,否则就不附加参数 |
| long_options | 以列表的格式定义,long_options 后的等号 “=
” 表示该选项必须有附加的参数,不带冒号表示该选项不附加参数 |
该方法返回值由两个元素组成: 第一个是 (option, value) 元组的列表。 第二个是参数列表,包含那些没有 - 或 – 的参数。
下面编写 script_2.py
脚本进行演示:
import sys
import getopt
def main(argv):
input_file = “”
output_file = “”
“hi⭕️”: 短格式分析串, h 后面没有冒号, 表示后面不带参数; i 和 o 后面带有冒号, 表示后面带参数
[“help”, “input_file=”, “output_file=”]: 长格式分析串列表, help后面没有等号, 表示后面不带参数; input_file和output_file后面带冒号, 表示后面带参数
返回值包括 opts
和 args
, opts 是以元组为元素的列表, 每个元组的形式为: (选项, 附加参数),如: (‘-i’, ‘test.png’);
args是个列表,其中的元素是那些不含’-‘或’–'的参数
opts, args = getopt.getopt(argv[1:], “hi⭕️”, [“help”, “input_file=”, “output_file=”])
for opt, arg in opts:
if opt in (“-h”, “–help”):
print(‘script_2.py -i <input_file> -o <output_file>’)
print(‘or: test_arg.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(‘输入文件为:’, input_file)
print(‘输出文件为:’, output_file)
打印不含’-‘或’–'的参数
for i in range(0, len(args)):
print(‘不含’-‘或’–‘的参数 %s 为:%s’ % (i + 1, args[i]))
if name == “main”:
main(sys.argv)
使用带有命令行选项的命令执行此脚本,以下两种方式是等价的:
方式1
python scripy_1.py -i test.png -o output.png OpenCV
方式2
python scripy_1.py --input_file test.png --output_file output.png OpenCV
输出得到以下信息:
输入文件为: test.png
输出文件为: output.png
不含’-‘或’–'的参数 1 为:OpenCV
2.2 Exception getopt.GetoptError
在参数列表中没有找到所传递参数,或选项的需要的参数为空时会触发该异常。异常的参数是一个字符串,表示错误的原因。属性 msg
和 opt
为相关选项的错误信息。
在上述代码中添加异常处理,检查此错误信息:
…
def main(argv):
input_file = “”
output_file = “”
try:
opts, args = getopt.getopt(argv[1:], “hi:o”, [“help”, “input_file=”, “output_file=”])
except getopt.GetoptError as e:
print(e.msg)
print(e.opt)
sys.exit(2)
…
使用错误的格式选项传递参数执行脚本:
python scripy_1.py -f
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
381401c05e862fe4e9.png)
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
[外链图片转存中…(img-UWDDEaET-1712697754815)]