Noah的学习笔记之Python篇:命令行解析
Noah的学习笔记之Python篇:
注:本文全原创,作者:Noah Zhang (http://www.cnblogs.com/noahzn/)
在Python中,对命令行的解析方式不唯一,本文将介绍两种方法:一种是用sys.argv手动设置,另一种是用argparse模块。
一、sys.argv是什么
首先看一个例子:
import sys print(len(sys.argv))
for arg in sys.argv:
print(arg)
将以上代码保存为argparse1.py,然后cmd下定位到这个文件所在目录,输入:
python argparse1.py arg1 arg2 arg3
回车后,运行结果为:
argparse1.py
arg1
arg2
arg3
sys.argv是一个list,保存命令行参数,其中第一个值是“该程序所在路径”,我们可以观察到:在cmd中输入的参数被依次传入这个列表中(以空格作为间隔)。
二、使用sys.argv解析命令行
大致了解了sys.argv,我们可以手动写命令行解析功能。代码如下:
import sys
if sys.argv[1].startswith('--'):
arg = sys.argv[1][2:]
if arg == 'help':
print("这里打印帮助信息")
elif arg == 'sum':
count = 0
if len(sys.argv) < 3:
print("想要使用sum功能,请输入一些数字")
sys.exit()
for i in sys.argv[2:]:
try:
count += int(i)
except ValueError as e:
print("输入的参数不正确")
sys.exit()
print(count)
将以上代码保存为argparse1.py,然后cmd下定位到这个文件所在目录,输入:
python argparse1.py --help
回车后,输出一行字:这里打印帮助信息
继续输入:
python argparse1.py --sum
回车后,输出:13
试试看输入异常值:
python argparse1.py --sum a
回车后,输出一行字:输入的参数不正确
继续输入:
python argparse1.py --sum
回车后,输出一行字:想要使用sum功能,请输入一些数字
上述代码可以捕捉 "--help"和"--sum"两个命令,如果用户传入"help",程序会打印一些帮助信息,如果用户传入"--sum",则会将之后的参数做累加计算并输出结果,也能处理一些异常情况。
下面介绍使用argparse模块来解析命令行参数。
三、argparse模块
Python2.7版本开始自带argparse模块,这是一个用来解析命令行参数的模块,可以自动生成帮助信息。
首先,我们来看一下最简单的使用:
import argparse myParser = argparse.ArgumentParser(description='解析命令行演示')
myParser.parse_args()
将以上代码保存为argparse1.py,然后cmd下定位到这个文件所在目录,输入:
python argparse1.py --help
回车后,输出:
usage: argparse1.py [-h] 解析命令行演示 optional arguments:
-h, --help show this help message and exit
我们可以看到,使用argparse模块,会自动包含--help信息。
四、argparse定制解析
接着,我们可以使用add_argument方法来增加参数。先来看一个简单的实例:
import argparse
import math myParser = argparse.ArgumentParser() # 默认接收的参数都是str类型,因此这里要限定一下参数类型
myParser.add_argument('-f', '--factorial', type=int, help="给出一个正整数,可以求出该数的阶乘")
myParser.add_argument('-a', '--accumulate', type=float, help="计算若干个浮点数的累加值", nargs='*')
args = myParser.parse_args() if args.factorial:
print(math.factorial(args.factorial))
if args.accumulate:
print(sum(i for i in args.accumulate))
将以上代码保存为argparse1.py,然后cmd下定位到这个文件所在目录,输入:
python argparse1.py -f
回车后,输出:24
继续输入:
python argparse1.py -a 1.2 3.2 0.2
输出:4.7
以上的代码定义了两个参数,factorial可以求阶乘,accumulate是累加计算。增加参数解析的方法如下:
ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
介绍其中几个参数:
name or flags - 定义参数的名字
action - 定义了一些基本的处理方式:
'store' - 默认值就是这个,保存命令行参数
'store_const' - 设立并保存一个静态值:parser.add_argument('--example', action='store_const', const=2)
'store_true' 和 'store_false' - 设立并保存一个布尔值。
'append' - 将同一个参数的值加入列表中
'append_const' - 设立并保存静态值到列表中
'count' - 计算关键词出现的次数
'help' - 打印帮助信息,默认值也有这个
'version' - 版本号:parser.add_argument('--example', action='version', version='1.0')
nargs - 定义接收参数值的数量:
N - 任意一个整数,以列表形式保存
'*' - 接收任意数量的参数值,以列表形式保存
'+' - 和'*'一样可以接收任意数量的参数值,并且,如果没有参数值,会抛出error
'argparse.REMAINDER' - 所有剩余的参数值都会被放到一个list中
type - 定义参数值的类型,默认参数值类型是string,也可以利用type来调用一个函数,将接收到的参数值传给一个自定义函数!
choices - 定义一个列表来限定用户传入的参数值。
如:praser.add_argument('--example', type=int, choices=range(1,5)),这样用户只能传入1,2,3,4这几个数字,不然会抛出参数值不合法的error。
required - 限定某个参数是不是必填项,值为True或False
help - 参数的帮助信息~
dest - 接收到的参数值赋给某个变量。
如:praser.add_argument('--example', type=int),传入2,则example=2;若改为:praser.add_argument('--example', type=int, dest='myValue'),传入2,则myValue=2。
四、设定“互斥”参数
上面那段示例代码中的两个参数,我们可以同时操作,就像这样:python argparse1.py -a 1.2 3.2 0.3 -f 4,但是有时候,几个参数我们想只让用户选其中一个进行操作,这时候就要用到“互斥”功能了~将代码修改成如下:
import argparse
import math myParser = argparse.ArgumentParser() # 互斥方法
group = myParser.add_mutually_exclusive_group() group.add_argument('-f', '--factorial', type=int, help="给出一个正整数,可以求出该数的阶乘")
group.add_argument('-a', '--accumulate', type=float, help="计算若干个浮点数的累加值", nargs='*')
args = myParser.parse_args() if args.factorial:
print(math.factorial(args.factorial))
if args.accumulate:
print(sum(i for i in args.accumulate))
如果这时候,我们再一起传值,输入:python argparse1.py -a 1.2 3.2 0.3 -f 4,就会抛出错误:
usage: argparse1.py [-h] [-f FACTORIAL | -a [ACCUMULATE [ACCUMULATE ...]]]
argparse1.py: error: argument -f/--factorial: not allowed with argument -a/--accumulate
五、小结
本文介绍了两种Python解析命令行的方法,相比之下,使用argparse模块,确实更方便一些。当然啦,argparse模块的内容可不止这一点哦,如果大家有兴趣的话,可以自己去看这个模块的官方文档~~
注:本文全原创,作者:Noah Zhang (http://www.cnblogs.com/noahzn/)
Noah的学习笔记之Python篇:命令行解析的更多相关文章
- Noah的学习笔记之Python篇:函数“可变长参数”
Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang (http://www.cnblogs.com/noahzn/) ...
- Noah的学习笔记之Python篇:装饰器
Noah的学习笔记之Python篇: 1.装饰器 2.函数“可变长参数” 3.命令行解析 注:本文全原创,作者:Noah Zhang (http://www.cnblogs.com/noahzn/) ...
- python实现命令行解析的argparse的使用
参考https://docs.python.org/3.6/library/argparse.html argparse模块使编写用户友好的命令行界面变得很容易.程序定义了它需要什么参数,argpar ...
- 【python】命令行解析工具argparse用法
python的命令行参数 之前有用到optget, optparse, 现在这些都被弃用了. import argparse parser = argparse.ArgumentParser() ar ...
- python之命令行解析工具argparse
以前写python的时候都会自己在文件开头写一个usgae函数,用来加上各种注释,给用这个脚本的人提供帮助文档. 今天才知道原来python已经有一个自带的命令行解析工具argparse,用了一下,效 ...
- Python模块: 命令行解析optionparser
Python 有两个内建的模块用于处理命令行参数:一个是 getopt,<Deep in python>一书中也有提到,只能简单处理 命令行参数:另一个是 optparse,它功能强大,而 ...
- 【python】命令行解析工具getopt用法
处理命令行参数的模块 用法: opts, args = getopt.getopt( sys.args[1:], shortStr, longList) 输入: shortStr 形式如下: &q ...
- ARM学习笔记10——GNU ARM命令行工具
一.编译器arm-linux-gcc 1.用arm-linux-gcc编译一个程序,一般它是要经过如下步骤的: 1.1.预处理阶段 编译器把上述代码中stdio.h编译进来,使用GCC的选项-E可以使 ...
- 学习笔记13—python DataFrame获取行数、列数、索引及第几行第几列的值
1. df=DataFrame([{‘A’:’11’,’B’:’12’},{‘A’:’111’,’B’:’121’},{‘A’:’1111’,’B’:’1211’}]) print df.column ...
随机推荐
- POJ 3734
题目的大意: 给定待粉刷的n个墙砖(排成一行),每一个墙砖能够粉刷的颜色种类为:红.蓝.绿.黄, 问粉刷完成后,红色墙砖和蓝色墙砖都是偶数的粉刷方式有多少种(结果对10007取余). 解题思路: 思路 ...
- Bulk Insert命令具体
Bulk Insert命令具体 BULK INSERT以用户指定的格式复制一个数据文件至数据库表或视图中. 语法: BULK INSERT [ [ 'database_name'.][ 'owner' ...
- android84 广播接受者
#广播接收者(广播接受者进程关闭了也能接收到广播,系统会在清单文件中找哪个广播接受者可以收到这条广播,然后去启动这个接受者的进程,找不到则广播发了就发了没人收到而已) * 现实中:电台要发布消息,通过 ...
- An NIO.2 primer--reference
Part 1: The asynchronous channel APIs The More New I/O APIs for the Java™ Platform (NIO.2) is one of ...
- Unity monodev环境搭建
断点调试功能可谓是程序员必备的功能了.Unity3D支持编写js和c#脚本,但很多人可能不知道,其实Unity3D也能对程序进行断点调试的.不过这个断点调试功能只限于使用Unity3D自带的MonoD ...
- java 对象的this使用 java方法中参数传递特性 方法的递归
一.this关键字,使用的情形,以及如何使用. 1.使用的情形 类中的方法体中使用this --初始化该对象 类的构造器中使用this --引用,调用该方法的对象 2.不写this,调用 只要方法或 ...
- Tcp抓包以及tcp状态解释
tcp三次握手 发送端发送一个SYN=1,ACK=0标志的数据包给接收端,请求进行连接,这是第一次握手:接收端收到请求并且允许连接的话,就会发送一个SYN=1,ACK=1标志的数据包给发送端,告诉它, ...
- jquery判断div是否显示或者隐藏
jquery判断div是否显示或者隐藏 很多时候会要判断一个div是不是显示着,没显示要怎么处理,显示的如何处理: 方法很简单,选择到你要判断的div,再用is(':hidden')判断是否隐藏:或者 ...
- WisDom.Net 框架设计(八) 持久层
WisDom.Net ---持久层 1.什么是持久层 持久层负责最基础的功能支撑,为项目提供一个高层,统一,和并发的数据持久机制,提供了比如建立数据库连接,关闭数据库连接,执行sql语 ...
- MongoDB 3.0安全权限访问控制(Windows版)
MongoDB 3.0安全权限访问控制(Windows版) 1.首先,不使用 –auth 参数,启动 mongoDB: mongod --dbpath "d:\mongodb\data\db ...