写点什么

Python 命令行参数详解,Pythonui 基础

作者:程序媛可鸥
  • 2022 年 3 月 19 日
  • 本文字数:2742 字

    阅读完需:约 9 分钟

def main(argv):


input_file = ""


output_file = ""

"hi:o:": 短格式分析串, h 后面没有冒号, 表示后面不带参数; i 和 o 后面带有冒号, 表示后面带参数

["help", "input_file=", "output_file="]: 长格式分析串列表, help 后面没有等号, 表示后面不带参数; input_file 和 output_file 后面带冒号, 表示后面带参数

返回值包括 optsargs, opts 是以元组为元素的列表, 每个元组的形式为: (选项, 附加参数),如: ('-i', 'test.png');

args 是个列表,其中的元素是那些不含'-'或'--'的参数

opts, args = getopt.getopt(argv[1:], "hi:o:", ["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

在参数列表中没有找到所传递参数,或选项的需要的参数为空时会触发该异常。异常的参数是一个字符串,表示错误的原因。属性 msgopt 为相关选项的错误信息。


在上述代码中添加异常处理,检查此错误信息:

...

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


输出以下错误信息:


option -f not recognized


f


3. argparse




当程序中使用采用复杂参数或多个文件名时,推荐使用 Python 的 argparse 库,它以系统的方式处理命令行参数,从而可以编写用户友好的命令行程序。Python 标准库 argparse 同样也是用于解析命令行参数的模块。首先,由程序确定所需的参数,然后, argparse 将这些参数解析为 sys.argv。此外,argparse 会生成帮助和使用信息提示,并在提供无效参数时发出错误。


为了介绍此模块,编写 script_3.py,如下所示:


import argparse


parser = argparse.ArgumentParser()


parser.parse_args()


不带参数运行此脚本不会向 stdout 显示任何内容。但是,如果使用 --help-h 选项,将得到脚本的使用信息提示:


usage: scripy_3.py [-h]


optional arguments:


-h, --help show this help message and exit


指定其他参数会导致错误,例如使用如下命令:


scripy_3.py -i


则会报导致错误:


usage: scripy_3.py [-h]


argparse_minimal.py: error: unrecognized arguments: -i


由于未定义参数,因此不允许其他参数,接下来就添加一个参数,编写 script_4.py 脚本:


import argparse


parser = argparse.ArgumentParser()


parser.add_argument("first_argument", help="this is the string text in connection with first_argument")


args = parser.parse_args()


print(args.first_argument)


这里添加了 add_argument() 方法。此方法用于指定程序将接受哪些命令行选项,此处添加了 first_argument 参数。此外, argparse 模块存储所有参数,将其名称与每个添加参数的名称相匹配——在此处为 first_argument 。为了获得参数值,需要使用 args.first_argument


如果此脚本以下示方法执行,则输出为 10:


python scripy_4.py 10


但如果脚本在没有参数的情况下执行,则将输出以下信息:


usage: scripy_4.py [-h] first_argument


scripy_4.py: error: the following arguments are required: first_argument


最后,如果我们使用 -h 选项执行脚本,输出将如下所示:


usage: scripy_4.py [-h] first_argument


positional arguments:


first_argument this is the string text in connection with first_argument


optional arguments:


-h, --help show this help message and exit


默认情况下,argparse 将提供的选项视为字符串。因此,如果参数不是字符串,则应使用 type 选项。使用 script_5.py 脚本,其中添加了两个参数,这两个参数是 int 类型:


import argparse


parser = argparse.ArgumentParser()


parser.add_argument("first_number", help="first number to be added", type=int)


parser.add_argument("second_number", help="second number to be added", type=int)


args = parser.parse_args()


print("args: '{}'".format(args))


print("the sum is: '{}'".format(args.first_number + args.second_number))


args_dict = vars(parser.parse_args())


print("args_dict dictionary: '{}'".format(args_dict))


print("first argument from the dictionary: '{}'".format(args_dict["first_number"]))


在前面的示例中,通过调用 vars() 函数将参数存储在字典中:


args_dict = vars(parser.parse_args())


print("args_dict dictionary: '{}'".format(args_dict))


print("first argument from the dictionary: '{}'".format(args_dict["first_number"]))


如果不带参数执行脚本:


python script_5.py


则输出如下:


usage: scripy_5.py [-h] first_number second_number


scripy_5.py: error: the following arguments are required: first_number, second_number


(1)Python 所有方向的学习路线(新版)


这是我花了几天的时间去把 Python 所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。


最近我才对这些路线做了一下新的更新,知识体系更全面了。


![在这里插入图片描述](https://i



mg-blog.csdnimg.cn/1f807758e039481fa866130abf71d796.png#pic_center)


(2)Python 学习视频


包含了 Python 入门、爬虫、数据分析和 web 开发的学习视频,总共 100 多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。



(3)100 多个练手项目


我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。



用户头像

Python编程资料加Q群免费领取:419829237 2022.03.14 加入

还未添加个人简介

评论

发布
暂无评论
Python 命令行参数详解,Pythonui基础_Python_程序媛可鸥_InfoQ写作平台