在编写完一个Python脚本后,它便是一个存放在电脑里面的工具了,试想,如果在你要使用工具解决某个燃眉之急时还要去找一个该工具的使用环境的话,那是极为不便的。所以既然是脚本,脚本就该便捷,本文介绍了直接从命令行参数调用该脚本并输入需要执行的参数的两种方法。
sys.argv 是一个包含命令行参数的列表
这个函数需要你在命令行内输入需要的参数来执行,输入格式为:python test.py arg1 arg2 arg3
,示例:
import sys
print(sys.argv)
print(len(sys.argv))
右键在对应文件中打开cmd:
可以看到 sys.argv这个列表的首项为py文件本身,其他项为后面输入的参数(以空格分开),简单看就是python命令后的所有参数组成的一个列表。
是不是有什么不合理的地方呢??如果我输入的参数中带有命令行选项(-u、-v等),这些选项也会被识别为参数进而组成sys.argv列表,而这些参数事实上是我们不需要的,示例:
如果不想让这些命令行选项被列表收录的话,就要用到下面的getopt模块
getopt模块是专门处理命令行参数的模块,用于获取命令行选项和参数,也就是sys.argv。命令行选项使得程序的参数更加灵活。支持短选项模式(-)和长选项模式(–)。
说白了就是提取并分离命令行输入的命令行选项和其他信息
记住这个方法名和模块名同名
getopt.getopt(args, '字符串格式定义的短选项',[列表格式定义的长选项])
该方法返回值由两个元素组成: 第一个是 (option, value) 元组的列表。 第二个是参数列表,包含那些没有’-‘或’–'的参数。
args:因为要对输入的具体参数进行筛选,所以args=sys.argv[1:]
‘字符串格式定义的短选项’:定义时的冒号(表示该选项必须有附加的参数(无输入参数时为’ '),不带冒号表示该选项不能附加参数,例如:
up: 表示-u和-p后必须有附加参数
h:o 表示-h后必须有附加参数,-o后不能有附加参数
[列表格式定义的长选项]:定义时的等号(=)表示该选项必须有附加的参数,否则就不能附加参数,例如:
[‘username=’,‘password=’,‘help’]表示–username和–password后必须有附加参数,而help后不能有附加参数。
上面的‘不能附加参数’如果你有参数了怎么办?那么从出错地方开始,后面的所有-和–都不会被识别!!!!!!有没有想到rm -rf
???
所以这个:和=的作用是非常巨大且可谓“一失足成千古恨”的。。。示例:
import getopt,sys
try:
opts, args = getopt.getopt(sys.argv[1:], "u:o", ["username=","password=","help"])
print('opts=',opts)
print('args=',args)
except getopt.GetoptError:
print ('123')
sys.exit()
测试:
试想如果错误代码导致-rf后的所有输入无法被识别会发生什么!!
在没有找到参数列表,或选项的需要的参数为空时会触发该异常。
异常的参数是一个字符串,表示错误的原因。属性 msg 和 opt 为相关选项的错误信息。
对于短格式,"-"号后面要紧跟一个选项字母。如果还有此选项的附加参数,可以用空格分开,也可以不分开。长度任意,可以用引号。如以下是正确的:
-o
-oa
-obbbb
-o bbbb
-o "a b"
对于长格式,"–“号后面要跟一个单词。如果还有些选项的附加参数,后面要紧跟”=",再加上参数。"="号前后不能有空格。如以下是正确的:
--help=file1
而这些是不正确的:
-- help=file1
--help =file1
--help = file1
--help= file1