python提供了两种方法进行命令行的参数解析,分别是getoptoptparse类中的模块OptionParser,下面分别详细了解这两个模块:

1.getopt模块

首先复习C语言的命令行解析:

在C语言里,main函数的原型为int main(int argc, char *argv[]),argc指的是命令行传入的参数个数(程序的name为第一个参数),而argv(*argv[]也可以为**argv)则是一个指针数组,每一个元素为指向一个命令行参数的指针。示例如下:

C语言参数解析

getopt函数原型:

  • getopt.getopt(args, shortopts, longopts=[])

参数解释:

  • args:args为需要解析的参数列表。一般使用sys.argv[1:],这样可以过滤掉第一个参数(ps:第一个参数是脚本的名称,它不应该作为参数进行解析)
  • shortopts:短参数列表
  • longopts:长参数列表

返回值:

  • opts:解析的(option, value)列表对。
  • args:不属于格式信息的剩余命令行参数列表。

在Python里,命令行的参数和C语言很类似(Python解释器是用C语言实现的)。在Python里的命令行参数是存储在sys.argv里,argv是一个列表,第一个元素为程序名称。

下面通过例子了解 getopt模块:

 getopt模块的使用分为三个步骤:

1.导入getopt,sys模块。

2.分析命令行参数。

3.处理结果。

第一步:导入模块

import sys,getopt

第二步:处理方法如下(脚本名为test.py)

try:
opts, args = getopt.getopt(sys.argv[1:], "ho:", ["help", "output="])
except getopt.GetoptError:
# print help information and exit:

解释如下:

1. 处理所使用的函数叫getopt(),因为是直接使用import导入的getopt模块,所以要加上限定getopt才可以。 
2. 使用sys.argv[1:] 过滤掉第一个参数(它是执行脚本的名,不应算作参数的一部分)。 
3. 使用短格式分析串"ho:"。当一个选项只是表示开关状态时,即后面不带附加参数时,在分析串中写入选项字符。当选项后面是带一个附加参数时,在分析串中写入选项字符同时后面加一个":" 号 。所以"ho:" 就表示"h" 是一个开关选项;"o:" 则表示后面应该带一个参数。 
4. 使用长格式分析串列表:["help", "output="] 。长格式串也可以有开关状态,即后面不跟"=" 号。如果跟一个等号则表示后面还应有一个参数 。这个长格式表示"help" 是一个开关选项;"output=" 则表示后面应该带一个参数。 
5. 调用getopt函数。函数返回两个列表:opts 和args。opts为分析出的格式信息。args为不属于格式信息的剩余的命令行参数。opts是一个两元组的列表。每个元素为:( 选项串, 附加参数)。如果没有附加参数则为空串。 
6. 整个过程使用异常来包含,这样当分析出错时,就可以打印出使用信息来通知用户如何使用这个程序。在没有找到参数列表或选项的需要的参数为空时会触发该异常Exception getopt.GetoptError。异常的参数是一个字符串,表示错误的原因。

如上面解释的一个命令行例子为:

python test.py -h -o file --help --output=out file1 file2

在分析完成后,opts 应该是:

[('-h', ''), ('-o', 'file'), ('--help', ''), ('--output', 'out')]

而args 则为:

['file1', 'file2']

第三步:主要是对分析出的参数进行判断是否存在,然后再进一步处理。主要的处理模式为:

for key, val in opts:
if key in ("-h", "--help"):
usage() #处理参数
sys.exit()
elif key in ("-o", "--output"):
output = val

示例如下:

getopt示例

2.OptionParser模块

optparse模块是Python中用来编写命令行工具的包,尤其是其中的OptionParser类它功能强大,非常好用,可以方便地生成标准的、符合Unix/Posix 规范的命令行说明。
使用OptionParser类的流程是:

1)建立一个OptionParser类的实例作为命令行解析器;

2)使用创建的解析器定义命令行的格式、帮助信息等等。

3)从用户输入中获取命令行的对应信息并使用。

1)建立解析器

创建解析器很简单实例化类OptionParser,定义 opt = optparse.OptionParser(),该类创建时可以不提供任何参数,不过标准库为我们提供了很多有用的参数可以初始化很多有用的信息。进入类OptionParser中可以看到标准库为我们提供的初始化参数:

类OptionParser初始化参数

首先来看usage与prog(用于替换version和usage里面的prog)参数:

usage与prog示例

version参数:

version参数示例

descripiton参数:

descripiton参数示例

add_help_option参数(默认为True):

add_help_option参数示例

epilog参数:

epilog参数参数示例

2)定义命令行的构成

定义命令行的构成有多种方法,标准库推荐的做法是使用optparse.OptionParser.add_option方法。add_option有两种调用方法,一种是以optparse.make_option返回的optparse.option实例做为参数,另一种是传入能够作为make_option方法的参数的参数,如各种位置参数和关键字参数等。注意定义options出错会引发optparse.OptionError异常。
第一种方法:

命令行

第二种方法(add_option):

先看一个示例:

add_option示例

add_option中有多个参数分别为:

action:存储方式,可以为("store","store_const","store_true","store_false","append","append_const","count","callback","help","version")

type:类型("string", "int", "long", "float", "complex", "choice")

dest:存储的变量

default:默认值

help:帮助信息

1)首先来看action

  • store,store_false,store_true
action中的store,store_false,store_true示例

结果分析总结:

当action=store_true时,当指定-s参数,且后面有值,此时options.mode为True。-s后面无值时options.mode为False;

当action=store_false时,当指定-v参数,此时options.mode为False。-v后面无值时options.mode为False;

当未指定参数-s或者-v时options.mode为None;

未指定默认为action=store_true。

  • store_const
store_const示例

结果分析总结:

指定action = 'store_const', const,则此时options.score的值为const的值,不回受参数后面的值影响。

  • append
appand示例

结果分析总结:

指定action为append时,此时dest=money会将-a后面的值添加到default中并赋值给money(为一个列表)。

  • version
version示例
  • help
help示例
  • count
count示例
  • callback
callback示例
限制位置参数的个数

2)type

optparse模块有6种内建类型:int、long、float、complex、string、choice,对于string类型的输入不做检查;对于int或者long,如果:

i)输入以0x开头,以十六进制读入。 
ii)输入以0开头,以八进制读入。 
iii)输入已0b开头,以二进制读入。 
iv)其他情况,以十进制读入。

其实对于int和long会调用int()和long()进行转换,如果转换失败会抛出异常。float和complex的读取规则与int、long类似。choice是string的衍生类,是string的列表,指出允许的取值列表,如果输入错误引发OptionValueError异常。

type主要来看choice:

type中的choice示例

结果分析总结:

int、long、float、complex、string中的int已在append中使用将-a后面的参数(字符串)转换为int类型加入到default中。其他类似。choice为指定-t后面的参数只能为choices中的值,否则会触发异常。

3)参数解析

通过前面 1)创建解释器、2)定义命令行格式都是为了获取用户的输入。
(options, args) = parser.parse_args() ,其中options为一个类,通过print(options.__dict__)可以看出类中的变量,通过options.key来访问,同时会将多余的参数
其他没解析完的给args。

参数解析示例

3.参考文献

https://blog.csdn.net/xumingwei12345/article/details/51776884

https://blog.csdn.net/a464057216/article/details/47375999

Python学习笔记之参数解析的更多相关文章

  1. Python学习笔记 - 函数参数

    >>> def power(x): ... return x * x ... >>> power(5) 25 >>> def power(x, n ...

  2. python学习笔记 可变参数关键字参数**kw相关学习

    在Python中可以定义可变参数,顾名思义,可变参数就是传入参数是可变的.可以是任意个,以一个简单的数学编程为例,计算 sum = a * a + b * b + .....z * z 函数定义可以如 ...

  3. python学习笔记3.3_json解析

    一.json文件读取 源文件:exampl.json 二.json在线解析 常用网站:https://www.json.cn/  三.数据导出为json格式文件

  4. 吴裕雄--天生自然python学习笔记:网页解析

    抓取万水书苑网页中所有<a>标签中的超链接井显示. import requests from bs4 import BeautifulSoup url = 'http://www.wsbo ...

  5. Python学习笔记(十一)

    Python学习笔记(十一): 生成器,迭代器回顾 模块 作业-计算器 1. 生成器,迭代器回顾 1. 列表生成式:[x for x in range(10)] 2. 生成器 (generator o ...

  6. python学习笔记目录

    人生苦短,我学python学习笔记目录: week1 python入门week2 python基础week3 python进阶week4 python模块week5 python高阶week6 数据结 ...

  7. Deep learning with Python 学习笔记(1)

    深度学习基础 Python 的 Keras 库来学习手写数字分类,将手写数字的灰度图像(28 像素 ×28 像素)划分到 10 个类别 中(0~9) 神经网络的核心组件是层(layer),它是一种数据 ...

  8. Python学习笔记之常用函数及说明

    Python学习笔记之常用函数及说明 俗话说"好记性不如烂笔头",老祖宗们几千年总结出来的东西还是有些道理的,所以,常用的东西也要记下来,不记不知道,一记吓一跳,乖乖,函数咋这么多 ...

  9. Python学习笔记总结

    目录 Python学习笔记总结 前言 安装 数据类型 Hello,World 变量 字符串 首字母大写 全部小写 全部大写 Tab和换行符 格式化 去除空格 List列表 列表增删改查排序 遍历列表 ...

随机推荐

  1. git博客好的例子

    01: https://github.com/Gaohaoyang/gaohaoyang.github.io 02: https://gaohaoyang.github.io/2018/06/01/a ...

  2. Codeforces 675E Trains and Statistic - 线段树 - 动态规划

    题目传送门 快速的vjudge通道 快速的Codeforces通道 题目大意 有$n$个火车站,第$i$个火车站出售第$i + 1$到第$a_{i}$个火车站的车票,特殊地,第$n$个火车站不出售车票 ...

  3. JVM启动参数大全

    java启动参数共分为三类: 其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容: 其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足, ...

  4. (转)How Hash Algorithms Work

    本文转自:http://www.metamorphosite.com/one-way-hash-encryption-sha1-data-software   Home Posted: Novembe ...

  5. js操作css变量

    原文:http://css-live.ru/articles/dostup-k-css-peremennym-i-ix-izmenenie-spomoshhyu-javascript.html :ro ...

  6. CSS3实现基本图形

    http://blog.csdn.net/laokdidiao/article/details/51189476 代码: <!DOCTYPE html> <html> < ...

  7. 在centos6中编译安装httpd-2.4/搭建LAMP

    首先确保centos6安装平台安装一下环境: #yum groupinstall "Development  Tools" "Server Platform Develo ...

  8. 【转】Windows Live Writer 代码插件改造

    源码和插件都在后面,如果不想看我神神叨叨的可以直接到文章后面下载 一 .找插件 在使用Windows Live Writer 经常要用到插入代码的功能,根据博客园中教程,分别使用了: WindowsL ...

  9. 理解 Redis(6) - List 值

    list 值就是一组根据插入顺序排列的字符串, 从左向右排列, 左边为头(head), 右侧为尾(tail). 左边为顶部, 右边为底部. 下图为 list 值的示意图: 从左侧开始向键为 num 的 ...

  10. 【三十二】thinkphp之连接数据库、实例化模型

    1.连接数据库 Thinlphp内置了抽象数据库访问层,把不同的数据操作封装起来.我们只需要调用公共的DB类进行操作即可.DB类会自动调用相应的数据库驱动来处理. 在应用目录/common/conf/ ...