Python命令行参数解读
0.命令行参数
一般,对于小型项目程序而言,执行程序的一个必要的步骤是正确处理命令行参数,这种命令行参数是提供给包含某种参数化信息的程序或脚本的参数。比如,在计算机视觉项目中node.js安装linux,图象和不同类型的文件一般作为命令行参数传递给脚本,用于使程序可以处理不同图片或则不同类型文件。
命令行参数是参数化程序执行的一种常见且简单的方式,下边主要介绍三种常见的获取和解析命令行参数的方式。
1.sys.argv
为了处理命令行参数,Python中外置了sys.argv模块linux 命令行参数android linux,通过模块中的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模块来辨识命令行选项。
2.getopt
getopt模块是专门处理命令行参数的模块,用于获取命令行选项和参数。命令行选项促使程序的参数愈发灵活,其支持短选项模式(-)和长选项模式(–)。
该模块提供了两个方式及一个异常处理来解析命令行参数。
2.1getopt.getopt方式
getopt.getopt方式用于解析命令行参数列表,其句型格式如下:

getopt.getopt(args, options[, long_options])

方式参数说明如下表所示:
参数说明
args
要解析的命令行参数列表,通常是sys.argv[1:],须要过滤掉脚本名(sys.argv[0])
options
以字符串的格式定义,options后的逗号“:”表示假如设置该选项,必须有附加的参数,否则就不附加参数
long_options
以列表的格式定义,long_options后的等号“=”表示该选项必须有附加的参数linux 命令行参数,不带引号表示该选项不附加参数
该方式返回值由两个元素组成:第一个是(option,value)元组的列表。第二个是参数列表,包含这些没有-或–的参数。
下边编撰script_2.py脚本进行演示:

import sys import getopt def main(argv): 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是个列表,其中的元素是那些不含'-'或'--'的参数 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 -o ') print('or: test_arg.py --input_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.2Exceptiongetopt.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

输出以下错误信息:

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

指定其他参数会造成错误,比如使用如下命令:
linux命令参数的先后顺序_linux命令参数说明_linux 命令行参数

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

据悉,假如我们使用-h选项执行脚本:

python script_5.py --help

输出将如下所示:

usage: scripy_1.py [-h] first_number second_number positional arguments: first_number first number to be added second_number second number to be added optional arguments: -h, --help show this help message and exit

倘若此脚本以如下形式执行:

python script_5.py 123 456

则输出如下:

args: 'Namespace(first_number=123, second_number=456)' the sum is: '579' args_dict dictionary: '{'first_number': 123, 'second_number': 456}' first argument from the dictionary: '123'

更多argparse的中级介绍可以在官方文档中见到,其中包括了大量示例。