简单介绍下getopt模块,getopt顾名思意(getoption)就是获取命令行参数的一个模块
一般我们获取命令行参数会使用到如下代码:
import sys
print sys.argv
然后终端调用 > python test.py -m abc -d 123
['test.py', '-m', 'abc', '-d', '123']
所有的命令行参数都被以空格分割放在了这个列表里,但是在实际使用的时候这会造成一些不方便的地方,例如,当你想控制参数的选填的时候,或者当你想取具体某个参数的时候。
所以,我们用到了getopt这个模块
先上代码
import getopt, sys
opts, args = getopt.getopt(sys.argv[1:], "md:", ["mail", "2fa="])#argv[1:]表示从第二个参数开始取,毕竟第一个参数是.py文件文件名
print opts, args
getopt的第二个参数是短格式分析串,第三个是长格式分析串列表
m 表示一个开关选项,对应的后面不跟参数,d: 的冒号:表示后面会跟对应的参数,对应长格式分析串中的=
然后返回的是 opts, args
opts是一个key-value的参数二元元组
args 是参数列表,也就是不在 -m -d 或者 --mail --2fa 范围内的其他参数
举几个例子
命令> python test.py -m -d 123 abc
输出 > [('-m', ''),('-d', '123')] ['abc']
这样看起来应该能理解了
但是,当 args 类的参数放在 选项参数之前或者顺序混乱的时候,问题就来了
—————————————————————
命令> python test.py -m abc -d 123
输出 > [('-m', '')] ['abc', '-d', '123']
—————————————————————
命令> python test.py abc -m -d 123
输出 > ['abc', '-m', '-d', '123']
_______________________________________________
所以这样就导致了无法取到想要的参数
查阅了相关资料发现 :一旦遇到非选项参数,getopt()
函数就停止处理选项类的参数了。
遂查询官方文档,发现 getopt.gnu_getopt 函数,遂改代码
import getopt, sys
opts, args = getopt.gnu_getopt(sys.argv[1:], "md:", ["mail", "2fa="])#argv[1:]表示从第二个参数开始取,毕竟第一个参数是.py文件文件名
print opts, args
—————————————————————
命令> python test.py -m abc -d 123
输出 > [('-m', ''),('-d', '123')] ['abc']
—————————————————————
好了,踩完坑之后填上了。
后面可以进行相关参数的处理了,示例代码
for op, value in opts:
if op in ['--2fa', '-d']:
two_fa_code = value
elif op in ['-m', '--mail']:
need_mail = True