python 命令行参数sys.grgv和getopt模块
在运行程序时,可能需要根据不同的条件,输入不同的命令行选项来实现不同的功能。
目前有短选项和长选项两种格式。短选项格式为"-"加上单个字母选项;长选项为"--"加上一个单词。
命令行参数分为选项(opts)和参数(args)
sys.argv获得命令行参数
import sys
print(sys.argv)
运行程序
D:\projects\runcmd>python test.py -a -b args1 --cc --dd=args2 file1
['test.py', '-a', '-b', 'args1', '--cc', '--dd=args2', 'file1']
可见,所有命令行参数以空格为分隔符,都保存在了sys.argv列表中。其中第1个为脚本的文件名。
选项的写法要求
短格式
"-"号后面要紧跟一个选项字母。
如果还有此选项的附加参数,可以用空格分开,也可以不分开。长度任意,可以用引号。
-o #只有选项,没有参数,用作功能开关
-oa #选项加参数,没有空格
-obbbb #选项加参数,没有空格
-o bbbb #选项加参数,有空格
-o "a b" #选项加参数,参数有空格需要加引号
长格式
"--"号后面要跟一个单词。
如果还有此选项的附加参数,后面要紧跟"=",再加上参数。"="号前后不能有空格。
--help=file1
getopt分析命令行参数
由sys.argv获得命令行参数以后,使用getopt模块进行分析
语法
getopt(args, shortopts, longopts=[])
第一个参数args为要分析的参数列表,一般设置为sys.argv[1:]
第二个参数为短格式选项
- 当只有选项,没有参数时,即-h 样式,在分析串中写入该字符,h或者-h
- 当选项有参数时,即-f file1样式,在分析串中写入该字符加冒号,f:或者-f:
第三个参数为长格式选项
当只有选项,没有参数时,即--help样式,在分析串中写入该参数。help
当选项有参数时,即--file=file1时,在分析串中吸入该参数加等号。file=
返回值
opts, args两个列表
opts为分析出的格式信息。opts是一个两元组的列表。每个元素为:(选项串,附加参数)。如果没有附加参数则为空字符串。
args为不属于格式信息的剩余的命令行参数,即不是按照getopt()里面定义的长或短选项字符和附加参数以外的信息。
示例1:getopt分析脚本参数
代码:
import sys,getopt
print(sys.argv)
opts, args = getopt.getopt(sys.argv[1:], '-a-b:', ['cc', 'dd='])
print('opts',opts)
print('args',args)
运行:
D:\projects\runcmd>python test.py -a -b args1 --cc --dd=args2 file1
['test.py', '-a', '-b', 'args1', '--cc', '--dd=args2', 'file1']
opts [('-a', ''), ('-b', 'args1'), ('--cc', ''), ('--dd', 'args2')]
args ['file1']
示例2:getopt进一步分析脚本参数,进行下一步处理
代码:
import sys,getopt
print(sys.argv)
opts, args = getopt.getopt(sys.argv[1:], 'hi:', ['help', 'ip='])
print('opts',opts)
print('args',args)
for opt_name,opt_value in opts:
if opt_name in ['-h','--help']:
print('help doc')
sys.exit()
if opt_name in ['-i','--ip']:
print(opt_value)
sys.exit()
运行:
D:\projects\runcmd>python test.py -h
['test.py', '-h']
opts [('-h', '')]
args []
help doc
D:\projects\runcmd>python test.py -i 192.168.1.1
['test.py', '-i', '192.168.1.1']
opts [('-i', '192.168.1.1')]
args []
192.168.1.1
示例3:各种用法
直接运行脚本,不加选项和参数,显示帮助信息
if len(sys.argv[1:]) == 0:
print(helpdoc)
sys.exit()
运行脚本,加-h或者--help选项,显示帮助信息
opts, args = getopt.getopt(sys.argv[1:], 'hsf:')
argsdict = {}
for opt_name, opt_value in opts:
argsdict[opt_name]=opt_value
if '-h' in argsdict: #帮助信息
print(helpdoc)
sys.exit()
参数信息不足,显示帮助信息
opts, args = getopt.getopt(sys.argv[1:], 'hsf:')
if len(args) < 5: # file,port,username,passeord,command1,[command2]...
print(helpdoc)
sys.exit()
获取参数信息
opts, args = getopt.getopt(sys.argv[1:], 'hsf:')
file, port, username, password, *commands = args
选项列表转化为字典
opts, args = getopt.getopt(sys.argv[1:], 'hsf:')
for opt_name, opt_value in opts:
argsdict[opt_name]=opt_value
选项信息不足,提示缺少选项
ip,port = None,None
for opt_name,opt_value in opts:
if opt_name in ['-h', '--help']:
print('help doc')
sys.exit()
if opt_name in ['-i', '--ip']: ip = opt_value
if opt_name in ['--port']: port = opt_value
if not ip:
print('ip not exit')
sys.exit()
if not port:
print('port not exit')
sys.exit()
处理选项与参数
处理选项
- 可以将选项列表转化为字典,然后判断选项是否在字典中
带参数的选项使用vaule = dict.get(key),
如果存在则返回参数值,如果不存在参数值为None,也可以dict.get(key,default)指定默认参数值
不带参数的选项使用in判断
- 可以直接处理(选项,参数)元组组成的列表,循环处理
为了防止运行脚本时,提交选项不足,使得参数未获取到值,可以先赋值变量值为空字符串或None,
然后再判断变量值,如果为空字符串或者None,中断程序,提示参数不足
处理参数
参数被收集到args列表中,是顺序的,所以针对列表
- len()判断参数个数
- 如果不需要进一步处理,直接传参列表args,或者列表解包*args
- 如果需要进一步处理,列表解包,file, port, username, password, *commands = args,再传参
- 函数fun形参为arge形式,表示只接受一个参数,调用时传入列表,fun(commands)
- 函数fun形参为*arge形式,表示接受多个参数,调用时传入解包列表,fun(*command)
示例4:模板
代码:
import sys,getopt
def fun(ip,port,args):
if flag :
print('True',ip,port,args)
else:
print('false',ip,port,args)
#不加参数提示帮助信息,或者运行函数
if len(sys.argv[1:]) == 0:
print('help doc')
sys.exit()
try: #getopt函数放到try里面,防止脚本调用时,出现不期望的参数,会报错
opts, args = getopt.getopt(sys.argv[1:], 'hsi:', ['help','ip=','port='])
except Exception as e:
print(e)
sys.exit()
#先分析选项
ip,port = None,None #提前赋值变量,然后分析getopt的返回结果,再对变量值进行判断,适用于必须的选项
flag = False #标志位,先置于False,再分析getopt的返回结果,如果存在标志位,再置为True,再在函数中判断标志位,作出不同的响应
for opt_name,opt_value in opts:
if opt_name in ['-h', '--help']: #帮助信息
print('help doc')
sys.exit()
if opt_name in ['-i', '--ip']: ip = opt_value #必须参数
if opt_name in ['--port']: port = opt_value #必须参数
if opt_name in ['-s']:flag = True #功能性参数,标志位
#
if not ip:
print('ip not exit')
sys.exit()
if not port:
print('port not exit')
sys.exit()
#再分析参数
if len(args) < 1: # 判断参数个数
print('helpdoc')
sys.exit()
else:
fun(ip,port,args) #如果选项都存在且不为空字符串,参数个数也齐全,再执行函数
运行:
D:\projects\runcmd>python test.py -i 192.168.0.1 --port=22 file1
false 192.168.0.1 22 ['file1']
D:\projects\runcmd>python test.py -s -i 192.168.0.1 --port=22 file1
True 192.168.0.1 22 ['file1']
D:\projects\runcmd>python test.py -i 192.168.0.1 --port=22 file1 file2
false 192.168.0.1 22 ['file1', 'file2']
D:\projects\runcmd>python test.py -s -i 192.168.0.1 --port=22 file1 file2
True 192.168.0.1 22 ['file1', 'file2']