一、使用背景
在谈getopt()函数之前不得不谈 sys.argv[]是怎么承接输入参数的。除了第一项是.py的文件路径外,后面的都以空格为分隔符进行切割,并且保存在了sys.argv列表中。例:
python get.py -o t --help cmd file1 file2
['C:get.py', '-o', 't', '--help', 'cmd', 'file1', 'file2']
二、getopt怎么用
① 首先导入关键模块
import sys
import getopt
在使用的时候,由于getopt函数是getopt包里面的一个函数,所以要getopt.getopt(...)这么用
② 熟悉getopt的使用方法
getopt.getopt(args, shortopts, longopts=[])
args:用户输入的参数列表,不包含程序名,故写成sys.argv[1:]
shortopts:短操作参数
【在.py程序中怎么写】:首先这个短操作参数肯定是一个字母;然后它可以写成纯字母(EG:o),也可以写成带一个-的形式(EG:-0);最后,如果你想让这个操作参数可以带一个用户输入参数进来,就得加一个冒号“:”,即o:或者-o:(当然,如果短操作参数决定夹带参数了,那么长操作参数也必须夹带参数)。需要额外指出的是,当有好几个短操作参数时候可以直接写到一起,EG:"abcd"或者"-abcd"或者"-ab-c-d",这个可以随意组合
【在cmd命令行中怎么调用】 python ".py文件绝对路径" -o 传给-o的参数
其中,传给-o的参数的格式为:
1ST:
-o 传给-o的参数(但是只要上面写了冒号要参数,只要输入提了-o 后面必须要有参数,不然报错)
2ND:
-o传给-o的参数(但是只要上面写了冒号要参数,只要输入提了-o 后面必须要有参数,不然报错)
3RD:
-o “传给-o的参数”(但是只要上面写了冒号要参数,只要输入提了-o 后面必须要有参数,不然报错)
注:这时候一定要有-了,即-o
longopts:长操作参数(实际上就是对应着shortpots的,给了一个用户更多的输入选择,后面会说)
【在.py程序中怎么写】:['help','filename=','version']
其中:首先,可以将长操作参数理解为对短操作参数只能写一个字母的弥补,即让程序更加简单易懂,并且输入的时候更友好,比如短操作参数-h可以扩展为-help;其次,长操作参数必须写在[]里,并且放在一对单引号里面,EG:['help'];然后,如果想承接参数(如果短操作参数里面有:了,那么这里也必须承接),后面加一个等号就好,EG:['help='];最后,和短操作参数不同,长操作参数必须用逗号隔开,而且每个都在一对单引号中
【在cmd命令行中怎么调用】 :python ".py文件绝对路径" --长操作参数名称=传给-o的参数
注:给个例子,对于上面的就是 --help=aaa。注意,不能加双引号、等号前后不能有空格
③ 熟悉getopt的的返回值
函数返回两个列表:opts和args。opts为分析出的格式信息。args为不属于格式信息的剩余的命令行参数,即不是按照getopt()里面定义的长或短选项字符和附加参数以外的信息。opts是一个两元组的列表。每个元素为:(选项串,附加参数)。如果没有附加参数(即短操作参数、长操作参数都没有:或=)则为空串''
EG:
![17ae19e52ff11965f668ed07498e707c.png](https://i-blog.csdnimg.cn/blog_migrate/5d53ced64fdbaf407ca58bc088b2058b.jpeg)
结果:
![64450c0a31989528aa9ae6aeba0d1a44.png](https://i-blog.csdnimg.cn/blog_migrate/fc779ca5895be3aae1df8da1faf330b5.png)
![ba5ad7734911f441d992424b0a9c97ce.png](https://i-blog.csdnimg.cn/blog_migrate/951fe3321628fdb6baac4850e68f846b.jpeg)
![d8ef39b64c83ae2e03ded93ac79061d1.png](https://i-blog.csdnimg.cn/blog_migrate/e0e1c2134338b04dda5fef45778d58a7.png)
注:首先要让程序正确识别,对于比如-h和-v这种不承接参数的,就别在后面硬写,故按照编程时候的思路来写;然后对于;然后,args这个没有约定的多余信息是很灵活的,比如第二次并没有输入全(但是还是,没有承接参数的别瞎写),但是还是把多余信息找出来了;最后,在第三种调用方式中,出现了长操作参数,并且元祖中的第一项也变成了--长操作参数的样子,这也引出了如果想将getopt得到的对应到变量或者做点别的,需要把长操作参数和短操作参数都写上:
![550727f4ce9f0bae2dba221463a221d1.png](https://i-blog.csdnimg.cn/blog_migrate/01da9cb4685bf8026913504555f87bf5.jpeg)
(这个例子中if后面的操作没有做任何赋值,只是输出了一个东西,然后直接退出程序了sys.exit(),也可以写成如下方式)
![c91dccba4b8da0130a5afa5365e06160.png](https://i-blog.csdnimg.cn/blog_migrate/3636017671c54814e2bb20072c130772.jpeg)
(注:这里最后有一个else,主要是如果你在if、elif中这if opt_name in ()括号里面的字符串写错了,比如应该是--help你给写成了--helo,防止报错)