因为需要通过外部传参来执行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在参数调用的时候就不需要传值。
需要传值的参数调用
短参数调用:-参数名[空格]参数值
长参数调用:–参数名=参数值