python 命令行 参数,如何为python代码传递命令行参数
python中有一个模块sys,sys.argv。此属性提供对命令行参数的访问。以下文章主要介绍Python命令行参数示例的相关信息,通过示例代码非常详细的介绍。有需要的可以参考一下。
00-1010 0.命令行参数1。sys . arg v2 . getopt 2.1 getopt.getopt方法2.2异常getopt . getopt错误3.argparse摘要
目录
一般来说,对于大型项目程序,程序执行的一个必要步骤是正确处理命令行参数,命令行参数是提供给程序或脚本的包含某些参数化信息的参数。例如,在计算机视觉项目中,图像和不同类型的文件通常作为命令行参数传递给脚本,以便程序可以处理不同的图片或不同类型的文件。
命令行参数是参数化程序执行的一种常见而简单的方法。下面是获取和解析命令行参数的三种常用方法。
0. 命令行参数
为了处理命令行参数,Python内置了sys.argv模块。所有命令行参数都可以通过模块中的sys.argv访问,它的返回值是一个包含所有命令行参数的列表。当程序执行时,Python从命令行获取所有值,并将它们存储在sys.argv列表中。列表中的第一个元素sys.argv[0]是脚本的完整路径(或者脚本名称3354取决于特定的操作系统)。列表的第二个元素是脚本的第一个命令行参数,即sys.argv[1],依此类推。这在下图中可以清楚地看到,其中script_1.py脚本是用两个参数执行的:
接下来,我们来看看sys.argv是如何工作的。首先,编写脚本scripy_1.py:
导入系统
打印(运行脚本名: {} 。格式(sys.argv[0]))
Print(脚本的参数个数是: {} 。格式(len(sys.argv)))
Print(脚本3360的参数 {} )。格式(str (sys.argv)))
如果我们不带任何参数执行这个脚本:
python script_1.py
您将看到以下信息:
运行脚本名: script_1.py
脚本的参数数量是:个“1”
脚本的参数: [script_1.py]
如果我们用多个参数3360执行这个脚本
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模块来识别命令行选项。
1. sys.argv
Getopt模块是一个处理命令行参数的模块,用于获取命令行选项和参数。命令行选项使程序的参数更加灵活,它支持短选项模式(-)和长选项模式()。
这个模块提供了两个方法和一个异常处理来解析命令行参数。
2. getopt
Getopt.getopt方法用于解析命令行参数。
列表,其语法格式如下:
getopt.getopt(args, options[, long_options])
方法参数说明如下表所示:
参数 说明
:
表示如果设置该选项,必须有附加的参数,否则就不附加参数=
表示该选项必须有附加的参数,不带冒号表示该选项不附加参数 该方法返回值由两个元素组成: 第一个是 (option, value) 元组的列表。 第二个是参数列表,包含那些没有 - 或 – 的参数。
下面编写 script_2.py 脚本进行演示:
import sysimport 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 <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)
使用带有命令行选项的命令执行此脚本,以下两种方式是等价的:
# 方式1python 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
输出以下错误信息:
option -f not recognizedf
3. argparse
当程序中使用采用复杂参数或多个文件名时,推荐使用 Python 的 argparse 库,它以系统的方式处理命令行参数,从而可以编写用户友好的命令行程序。Python 标准库 argparse 同样也是用于解析命令行参数的模块。首先,由程序确定所需的参数,然后, argparse 将这些参数解析为 sys.argv。此外,argparse 会生成帮助和使用信息提示,并在提供无效参数时发出错误。
为了介绍此模块,编写 script_3.py,如下所示:
import argparseparser = 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 argparseparser = 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_argumentpositional arguments:
first_argument this is the string text in connection with first_argumentoptional arguments:
-h, --help show this help message and exit
默认情况下,argparse 将提供的选项视为字符串。因此,如果参数不是字符串,则应使用 type 选项。使用 script_5.py 脚本,其中添加了两个参数,这两个参数是 int 类型:
import argparseparser = 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_numberpositional arguments:
first_number first number to be added
second_number second number to be addedoptional 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 的高级介绍可以在官方文档中看到,其中包括了大量示例。
总结
到此这篇关于Python命令行参数详解的文章就介绍到这了,更多相关Python命令行参数内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。