python getopt模块踩坑指南

简单介绍下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() 函数就停止处理选项类的参数了。

python getopt模块踩坑指南_第1张图片

遂查询官方文档,发现 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

 

你可能感兴趣的:(python)