python提供了两种方法进行命令行的参数解析,分别是getopt和optparse类中的模块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. python简说(十六)第三方模块安装

    安装第三模块 1.pip install xxx pip问题 1.提示没有pip命令的, 把python的安装目录. 安装目录下面的scripts目录加入到环境变量里面 2.Unknown or un ...

  2. 《linux内核设计分析》 第一周作业

    linux 基础入门 课程总结 一.linux系统简介 linux操作系统 整个计算机可以分为 硬件 内核 系统调用 应用程序 操作系统就属于内核和系统调用这两部分 操作系统历史发展 批处理操作系统 ...

  3. mysql 的delete from 和update子查询限制

    最经做项目时发现的问题,好像在update时也有... 网上查到的资料如下: 1.使用mysql进行delete from操作时,若子查询的 FROM 字句和更新/删除对象使用同一张表,会出现错误. ...

  4. 《AngularJS开发下一代Web应用》读书笔记与感想

    该书一共130页打算四天读完,边读边记录. 1. 2.学习MogoDB 3. 4. 5. 创建标识符的一段简单伪码模板: var myModule = angular.module(...); myM ...

  5. Oracle用户被锁定解决方法

    解决方法: 1.用dba角色登陆:2.输入下面格式命令解锁: alter user 用户名 account unlock;3.如果密码忘记了,输入下面格式命令修改密码: alter user 用户名 ...

  6. Java 大数任意进制转换

    import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner cin = ...

  7. .Net Core Package lose or not match

    错误.警告的说明: 示例一: 严重性:警告 代码:MSB3106 说明 :程序集强名称“C:\Users\$(computerName)\.nuget\packages\$(packageName)\ ...

  8. hadoop的Linux操作

    初学hadoop之linux系统操作的hdfs的常用命令 Hadoop之HDFS文件操作 Hadoop fs命令详解 官网doc sudo su - hdfs:免密,以hdfs账户登陆.可操作hdfs ...

  9. java泛型的作用和好处

    转载于:https://blog.csdn.net/u012760183/article/details/52092692 之前参加面试的时候遇到面试官问泛型的作用,只是说了大概自己的理解, 在此转载 ...

  10. Python: 字典应用题

    Write a program to read through the mbox-short.txt and figure out who has sent the greatest number o ...