因为需要通过外部传参来执行python代码,查阅资料,了解到python自带的getopt模块能够实现我的需求。此篇文章主要记录getopt模块的相关用法。
getopt简述
  getopt模块专门用来处理命令行参数。具体用法我们通过代码实例进行验证。
  如果你想直接一步到位,不想阅读我后面的文章,你也可以输入以下代码查看相关帮助信息。1
2import getopt
print(getopt.__doc__)
getopt模块详解
  这个模块有两个函数,两个属性。
函数:1
2getopt.getopt()
getopt.gnu_getopt()
属性:1
2getopt.error
getopt.GetoptError
两个属性主要用来抛出错误信息。我们一般常用的是getopt函数,文章后面主要介绍getopt函数的具体用法。
getopt函数的参数
| 1 | getopt.getopt(args,shortopts,longopts=[]) | 
args指的是当前脚本接收的参数,是一个列表。可以由sys.argv获取,sys.argv[0]表示当前脚本名。
shortopts是短参数,类似python3 test.py -h
longopts是参数,类似python3 test.py –help
getopt函数返回值
我们将下面的代码写到test.py文件中。sys.argv[0]代表的是当前脚本的文件名,所以应该写sys.argv[1:]1
2
3import sys,getopt
args=getopt.getopt(sys.argv[1:],"-h",["help"])
print(args)
执行代码1
python3 test.py -h helpinfo
查看代码执行结果可知getopt函数返回的一个二元组的列表。
代码实例
以下代码是从我的一个工具开发项目中截取的部分。python文件名为Parserpkt.py。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39import sys,getopt
#命令行帮助信息
def usage():
    Usage = """
    Usage:
    Options:
    [--args args] \t\t-- 需要查询或者获取的参数\n \
    [-f filename.cap] \t\t-- 获取数据包的目录,默认/tmp/packe/snmp.cap \
    [-o parser_filename] \t-- 解析数据包生成的文件,默认/tmp/packet/result.txt\n \
    [-v ] \t\t-- 工具程序的版本 \n\
    [-h | --help] \t\t-- 显示帮助信息\n\
    eg:
        --args ip.src=192.168.1.1,ip.dst=224.0.0.2,igmp.type
        表示查询源地址为1.1,目的IP地址0.22的组播type值
    """
    print(Usage)
#处理参数
opts,args=getopt.getopt(sys.argv[1:],'f:o:vh',["help","args="])
# print('opts:',opts)
# print('args:',args)
for op,value in opts:
    if op == '-f':
        packetfile=value
    elif op == '-o':
        parserfile=value:
    elif op == '-v':
        print('version:1.0.0')
    elif op == '--args':
        allargs=value
        kargs={}
        largs=[]
        for subargs in allargs.split(','):
            if "=" in subargs:
                kargs[subargs.split('=')[0]]=subargs.split('=')[1]
            else:
                largs.append(subargs)
    elif op in ('-h','--help'):
        usage()
        sys.exit()
打印工具版本和帮助信息1
python3 Parserpkt.py -v -h
传入带值的参数,执行代码1
python3 Parserpkt.py -f test.pcap --args ip.src=192.168,ip.dst
短参数名定义了 ‘f:o:vh’ , f和o后面均有”:”,这个:代表了当前参数是有值的。v和h后面没有:,所以在参数调用的时候就不需要传值。
长参数名定义了help和args。args需要接收参数值,所以必须在参数后面加上”=”。help在参数调用的时候就不需要传值。
需要传值的参数调用
短参数调用:-参数名[空格]参数值
长参数调用:–参数名=参数值
