getopt模块(推荐argparse)(python getopt模块)

getopt模块(不推荐)

getopt 模块用于获取命令行选项和参数,也就是sys.argv。支持短选项模式(-)和长选项模式(--)。该模块提供了两个方法、两个属性及一个异常处理来解析命令行参数。
函数:

· getopt.getopt

· getopt.gnu_getopt

属性:

· getopt.error

· getopt.GetoptError
这两个属性主要是用来抛出错误信息的。

getopt.getopt 方法

getop模块的getopt 函数,抽取sys.argv获得的用户输入来确定执行步骤。语法格式如下:

getopt.getopt(args, options[, long_options])
getopt.getopt( [命令行参数列表], "短选项", [长选项列表] )

参数

args: 要解析的命令行参数列表。

options : 以字符串的格式定义,options 后的冒号 : 表示如果设置该选项,必须有附加的参数,否则就不附加参数。短参数使用的时候是参数名[空格]参数值

long_options : 以列表的格式定义,long_options 后的等号 = 表示该选项必须有附加的参数,不带冒号表示该选项不附加参数。长参数使用的时候是参数名=参数值

返回值

该函数返回两个值:opts和args。

opts为分析出的格式信息,(option, value) 元组的列表。存有所有选项及其输入值的元组。当输入确定后,这个值不能被修改了。每个元素为:( 选项串,附加参数) 。如果没有附加参数则为空串'' 。

args为不属于格式信息的剩余的命令行参数列表

另外一个方法是 getopt.gnu_getopt,这里不多做介绍

Exception getopt.GetoptError

在没有找到参数列表,或选项的需要的参数为空时会触发该异常。

异常的参数是一个字符串,表示错误的原因。属性 msg 和 opt 为相关选项的错误信息。

官方介绍地址:
https://docs.python.org/3.1/library/getopt.html

实例

import getopt,sys

shortargs = 'f:t' #短选项

longargs = ['directory-prefix=', 'format', '--f_long='] #长选项

opts,args= getopt.getopt( sys.argv[1:], shortargs, longargs)

print('opts=',opts)

print('args=',args)

几种输出结果为:

分清longargs长选项里面的数据,是什么样的必须在前面追加--,不然出异常。例如

正确格式:----f_long='data'

错误格式:--f_long='data'

正确:


进阶

print(getopt.__doc__)

返回值

这个函数返回是一个两元组的列表(元组的值是不可修改的!)

import getopt

import sys


arg = getopt.getopt(sys.argv[1:],'-h',['help'])

print(arg)

结果如下:

root@Kali:~/python# python3.5 test.py -h

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

root@Kali:~/python# python3.5 test.py --help

([('--help', '')], [])

root@Kali:~/python#

可以看到已经接收了参数。

因为sys.argv里的argv[0]是当前脚本的文件名,不需要它去参与,所以传入传入sys.argv[1:]。

实例1

假定创建这样一个脚本,可以通过命令行向脚本文件传递两个文件名,同时通过另外一个选项查看脚本的使用。脚本使用方法如下:

usage: test.py -i <inputfile> -o <outputfile>

test.py 文件代码如下所示:

import sys, getopt
def main(argv):
   inputfile = ''
   outputfile = ''
   try:
      opts, args = getopt.getopt(argv,"hi:o:",["ifile=","ofile="])
      print(“opts:”,opts)
      print("args:",args)
   except getopt.GetoptError:
      print('Usage: 'test.py -i <inputfile> -o <outputfile>')
      sys.exit(2)
   for opt, arg in opts:
      print(opt,arg)
      if opt == '-h':
         print('Usage: test.py -i <inputfile> -o <outputfile>')
         sys.exit()
      elif opt in ("-i", "--ifile"):
         inputfile = arg
      elif opt in ("-o", "--ofile"):
         outputfile = arg
   print('输入的文件为:', inputfile)
   print('输出的文件为:', outputfile)
if __name__ == "__main__":
   main(sys.argv[1:])

执行以上代码,输出结果为:

$ python test.py -h
usage: test.py -i <inputfile> -o <outputfile>
$ python test.py -i inputfile -o outputfile
opts: [('-o', 'output'), ('-i', 'input')]
args: []
-o output
-i input
输入的文件为: inputfile
输出的文件为: outputfile

代码解释:
a) sys.argv[1:]为要处理的参数列表,sys.argv[0]为脚本名,所以用sys.argv[1:]过滤掉脚本名。
b) "hi:o:": 当一个选项只是表示开关状态时,即后面不带附加参数时,在分析串中写入选项字符。当选项后面是带一个附加参数时,在分析串中写入选项字符同时后面加一个":"号。
所以"hi:o:"就表示"h"是一个开关选项;"i:"和"o:"则表示后面应该带一个参数。
c) 调用getopt函数。函数返回两个列表:opts和args。opts为分析出的格式信息。args为不属于格式信息的剩余的命令行参数。opts是一个两元组的列表。每个元素为:(选项串,附加参数)。如果没有附加参数则为空串''。

getopt函数的第三个参数[, long_options]为可选的长选项参数,上面例子中的都为短选项(如-i -o)
长选项格式举例:
--version
--file=error.txt
让一个脚本同时支持短选项和长选项
getopt.getopt(sys.argv[1:], "hi:o:", ["version", "file="])

原文链接:,转发请注明来源!