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. linux配置powerline(bash/vim)美化

    安装powerline需要pip 链接:https://pan.baidu.com/s/1Jc59VD35PYic2fTK5v8h1w 密码:otfp pip curl https://bootstr ...

  2. 论证与测试 + 用EA画uml

    论证与测试,谁才是真正的不二法门 第十三次作业的时候,我们开始使用Junit对代码进行测试,主要是测试代码的覆盖率,以及分支的覆盖率.(主要是检查JSF写的是否是符合规范,……). 这里我给出我测试的 ...

  3. Codeforces 868C Qualification Rounds - 位运算

    Snark and Philip are preparing the problemset for the upcoming pre-qualification round for semi-quar ...

  4. 写了个脚本将json换成md

    用python 脚本将protocol.json中的json按照templete.md模版生成,结果在protocol.md中 Python: #!/usr/bin/python # -*- codi ...

  5. LightOJ 1030 Discovering Gold(概率DP)题解

    题意:1~n每格都有金子,每次掷骰子,掷到多少走几步,拿走那格的金子,问你金子的期望 思路:dp[i]表示从i走到n金子的期望,因为每次最多走1<=x<=6步,所以dp[i] = a[i] ...

  6. HDU 5069 Harry And Biological Teacher(AC自动机+线段树)

    题意 给定 \(n\) 个字符串,\(m\) 个询问,每次询问 \(a\) 字符串的后缀和 \(b\) 字符串的前缀最多能匹配多长. \(1\leq n,m \leq 10^5\) 思路 多串匹配,考 ...

  7. QLineEdit响应回车时避免Button同时响应

    pButton->setAutoDefault(false);

  8. Latex: "Missing $ inserted" 解决方法

    参考: Latex报"Missing $ inserted"的解决方法 Latex: "Missing $ inserted" 解决方法 原因一:在文中出现&q ...

  9. 2、Python程序控制结构(0530)

    条件测试: 1.if 条件测试表达式 python的比较操作 1.所有的python对象都支持比较操作 可用于测试相等性.相对大小等: 如果是符合对象,python会检查其所有部分,包括自动遍历各级嵌 ...

  10. 【Ruby】【遇到的问题】

    1 Error fetching https://gems.ruby-china.org/: certificate verify failed (https://gems.ruby-china.or ...