python 命令行参数sys.grgv和getopt模块

在运行程序时,可能需要根据不同的条件,输入不同的命令行选项来实现不同的功能。

目前有短选项和长选项两种格式。短选项格式为"-"加上单个字母选项;长选项为"--"加上一个单词。

命令行参数分为选项(opts)和参数(args)

sys.argv获得命令行参数

import sys

print(sys.argv)

运行程序

D:projects uncmd>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 uncmd>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 uncmd>python test.py -h

['test.py', '-h']

opts [('-h', '')]

args []

help doc

 

D:projects uncmd>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 uncmd>python test.py -i 192.168.0.1 --port=22 file1

false 192.168.0.1 22 ['file1']

 

D:projects uncmd>python test.py -s -i 192.168.0.1 --port=22 file1

True 192.168.0.1 22 ['file1']

 

D:projects uncmd>python test.py -i 192.168.0.1 --port=22 file1 file2

false 192.168.0.1 22 ['file1', 'file2']

 

D:projects uncmd>python test.py -s -i 192.168.0.1 --port=22 file1 file2

True 192.168.0.1 22 ['file1', 'file2']

 

 

原文地址:https://www.cnblogs.com/jeancheng/p/13339855.html