Python解析命令行读取参数 -- argparse模块
在多个文件或者不同语言协同的项目中,python脚本经常需要从命令行直接读取参数。万能的python就自带了argprase包使得这一工作变得简单而规范。PS:optparse包是类似的功能,只不过写起来更麻烦一些。
如果脚本很简单或临时使用,没有多个复杂的参数选项,可以直接利用sys.argv将脚本后的参数依次读取(读进来的默认是字符串格式)。比如如下名为test.py的脚本:
import sys
print "Input argument is %s" %(sys.argv)
在shell脚本中运行python test.py help可以得到Input argument is help的结果。
1) 一般形式
但是大多数情况下,脚本很可能需要多个参数,而且每次参数的类型用处各不相同,那么这个时候在参数前添加标签表明参数的类型和用途便十分有用,而利用argparse模块可以很方便得实现这一目的。
同样用名为test.py的脚本举个栗子:
import argparse
parser = argparse.ArgumentParser(description="your script description") # description参数可以用于插入描述脚本用途的信息,可以为空
parser.add_argument('--verbose', '-v', action='store_true', help='verbose mode') # 添加--verbose标签,标签别名可以为-v,这里action的意思是当读取的参数中出现--verbose/-v的时候
# 参数字典的verbose建对应的值为True,而help参数用于描述--verbose参数的用途或意义。
args = parser.parse_args() # 将变量以标签-值的字典形式存入args字典
if args.verbose:
print "Verbose mode on!"
else:
print "Verbose mode off!"
运行python test.py后面跟了--verbose/-v的时候会输出前者,如果什么都没有会输出后者。如果输入了--verbose/-v以外的参数则会报错:unrecognized arguments
稍微提一下,action参数表示值赋予键的方式,这里用到的是bool类型;如果是'count'表示将--verbose标签出现的次数作为verbose的值;'append'表示将每次出现的该便签后的值都存入同一个数组再赋值。(嘛,一般后面两种用的比较少就不多说了)
PS:--help标签在使用argparse模块时会自动创建,因此一般情况不需要我们主动定义帮助信息。
$ python test.py --help
usage: test.py [-h] [--verbose]
your script description
optional arguments:
-h, --help show this help message and exit
--verbose, -v verbose mode
2) 必需参数
这种模式用于确保某些必需的参数有输入。
parser.add_argument('--verbose', required=True, type=int)
required标签就是说--verbose参数是必需的,并且类型为int,输入别的类型会报错。
3)位置参数(positional arguments)
位置参数与sys.argv调用比较像,参数没有显式的--xxx或者-xxx标签,因此调用属性也与sys.argv相同。
parser.add_argument('filename') # 输入的第一个参数赋予名为filename的键
args = parser.parse_args()
print "Read in %s" %(args.filename)
输入python test.py test.txt则会输出Read in test.txt
此外,可以用nargs参数来限定输入的位置参数的个数,默认为1。当然nargs参数也可用于普通带标签的参数。
parser.add_argument('num', nargs=2, type=int)表示脚本可以读入两个整数赋予num键(此时的值为2个整数的数组)。nargs还可以'*'用来表示如果有该位置参数输入的话,之后所有的输入都将作为该位置参数的值;‘+’表示读取至少1个该位置参数。'?'表示该位置参数要么没有,要么就只要一个。(PS:跟正则表达式的符号用途一致。)比如用:
parser.add_argument('filename')
parser.add_argument('num', nargs='*)
就可以运行python test.py text.txt 1 2
由于没有标签,所以用位置参数的时候需要比较小心。
4)输入类型
之前已经提到了用type参数就可以指定输入的参数类型。而这个type类型还可以表示文件操作的类型从而直接进行文件的读写操作。
parser.add_argument('file', type=argparser.FileType('r')) # 读取文件
args = parser.parse_args()
for line in args.file:
print line.strip()
5)参数默认值
一般情况下会设置一些默认参数从而不需要每次输入某些不需要变动的参数,利用default参数即可实现。
parser.add_argument('filename', default='text.txt')
这个时候至直接运行python text.py就能得到Read in text.txt而不需要输入文件名了。
6)候选参数选择
表示该参数能接受的值只能来自某几个值候选值中,除此以外会报错,用choices参数即可。比如:
parser.add_argument('filename', choices=['test1.txt', 'text2.txt'])
参考:https://mkaz.tech/python-argparse-cookbook.html
https://docs.python.org/2/howto/argparse.html
Python解析命令行读取参数 -- argparse模块的更多相关文章
- python 解析命令行选项
问题: 程序如何能够解析命令行选项 解决方案 argparse 模块可被用来解析命令行选项 argparse 模块 argparse 模块是标准库中最大的模块之一,拥有大量的配置选项 dest 参数指 ...
- python解析命令行参数
常常需要解析命令行参数,经常忘记,好烦,总结下来吧. 1.Python 中也可以所用 sys 的 sys.argv 来获取命令行参数: sys.argv 是命令行参数列表 参数个数:len(sys.a ...
- python解析命令行
可以解析这样的命令 ./cron_ctrl jobname1 --stop ;./cron_ctrl jobname1 --start;./cron_ctrl jobname1 --list #!/u ...
- python 解析命令行
python中的命令行解析最简单最原始的方法是使用sys.argv来实现,更高级的可以使用argparse这个模块.argparse从python 2.7开始被加入到标准库中,所以如果你的python ...
- python 命令行参数——argparse模块的使用
以下内容主要来自:http://wiki.jikexueyuan.com/project/explore-python/Standard-Modules/argparse.html argparse ...
- python实现命令行解析的argparse的使用
参考https://docs.python.org/3.6/library/argparse.html argparse模块使编写用户友好的命令行界面变得很容易.程序定义了它需要什么参数,argpar ...
- optparse模块解析命令行参数的说明及优化
一.关于解析命令行参数的方法 关于“解析命令行参数”的方法我们一般都会用到sys.argv跟optparse模块.关于sys.argv,网上有一篇非常优秀的博客已经介绍的很详细了,大家可以去这里参考: ...
- Python的命令行参数(argparse)
参考:https://www.cnblogs.com/lindaxin/p/7975697.html 参考:https://www.cnblogs.com/dengtou/p/8413609.html ...
- boost之program_options库,解析命令行参数、读取配置文件
一.命令行解析 tprogram_options解析命令行参数示例代码: #include <iostream> using namespace std; #include <boo ...
随机推荐
- C语言中关于对目录的操作
原文地址:C语言中关于对目录的操作 目录的操作不论是在嵌入式产品还是应用软件编程都是必不可少的,不同的开发语言可能略有不同,笔者主要是讨论在Linux平台下对目录的一系列操作: 1.获取当前目录操作: ...
- 第三个Sprint冲刺第八天
讨论地点:宿舍 讨论成员:邵家文.李新.朱浩龙.陈俊金 讨论问题:做最后的工作
- Android 学习第15课,Android 开发的单元测试、及输出错误信息
这一节没有做实例,单元测试,以后用到再写吧
- C++类成员布局
在C++中对象的内存布局与类成员声明的顺序一致,静态成员放在数据区(Data Section)而非对象内存中,若多个类静态成员名称相同,C++则按照name mangling技术进行重命名保证名称的唯 ...
- 透过代码理解python的静态方法、类方法与实例方法
话不多说,直接上程序: a = 111 class A(object): a = 1 def f_instance(self): print self.a @staticmetho ...
- 可能是Mac环境变量恢复的参考
因为要做物联网实验的缘故,于是在Mac上用Android Studio想导入SensorSimulator的demo项目. 根据SensorSimulator的相关说明,需要先将Sensor Simu ...
- Linux 中断处理浅析
最近在研究异步消息处理, 突然想起linux内核的中断处理, 里面由始至终都贯穿着"重要的事马上做, 不重要的事推后做"的异步处理思想. 于是整理一下~ 第一阶段--获取中断号 每 ...
- MFC中换行实现
在mfc中编辑框允许输入多行时,换行符被表示为<归位><换行>即"\r\n",用ascii码表示为13 10 如果为编辑框中想要输入换行,就请将编辑框的属性 ...
- LintCode Anagrams
(记得import java.util.HashMap及Arrays, 首先字符串若为空或者数量为零, 则返回一个空的LinkedList) 1. 把string变为char数组, 再进行排序, 之后 ...
- IO流一行一行读取TXT文件
我们在开发或者测试的时候,往往会用到读取本地txt文件内容来处理数据的情况.下面是读取本地txt文件内容,是一行一行读取.如下列txt例子 小明 20 小红 20 小亮 20 下面是代码: publi ...