argparse模块入门介绍——基于python3.7
转载:https://blog.csdn.net/weixin_41796207/article/details/80846406
首先说明,本人是想要学习如何使用argparse模块,打造命令行程序。
但是网络上的各种教程写的只能说是惨不忍睹,反人类来形容。这样的文章写出来纯粹浪费大家时间。
找了很久,找到了python官方推荐的入门教程,看下来非常好。但是没有中文版。
本人尝试根据该教程,将argparse的核心使用方法做一介绍。
注:代码均命名为 1.py.
1. 命令行程序框架
代码如下:
- import argparse
- parser = argparse.ArgumentParser(description="程序的主要功能是...")
- parser.parse_args()
执行代码:
python 1.py --help
执行结果:
usage: 1.py [-h]
程序的主要功能是...
optional arguments:
-h, --help show this help message and exit
--help选项就是将命令行参数说一个说明。
-h 是 --help的缩写形式,二者效果相同。
如程序中展示的,可以通过description参数来对程序的主要功能做出说明。
2. 添加一个位置参数
代码如下:
- import argparse
- parser = argparse.ArgumentParser()
- parser.add_argument("echo")
- args = parser.parse_args()
- print('参数echo的值是{}'.format(args.echo))
执行代码:
python 1.py 'hello'
执行结果:
参数echo的值是hello
以上代码就是添加一个参数,存储在名字为'echo'的变量里面。
注意,要获取变量的值,需要先通过parse_args()方法获取args对象。
所以命令行信息都可以通过args对象取值获得。
注意,由于这里指定了位置参数,也就是说,如果执行程序时没有携带参数,则会报错。
执行代码:
python 1.py 'hello'
usage: 1.py [-h] echo
1.py: error: the following arguments are required: echo
3. 为位置参数添加说明
代码如下:
- import argparse
- parser = argparse.ArgumentParser()
- parser.add_argument("echo", help="我是关于echo的说明")
- args = parser.parse_args()
- print('参数echo的值是{}'.format(args.echo))
执行-h选项:
python 1.py -h
执行结果:
positional arguments:
echo 我是关于echo的说明
optional arguments:
-h, --help show this help message and exit
可以看见,-h的执行结果中,已经打印了代码中为位置参数echo添加的说明。
4. 指定参数类型
代码如下:
- import argparse
- parser = argparse.ArgumentParser()
- parser.add_argument("square", type=int)
- args = parser.parse_args()
- print(args.square**2)
执行代码:
python 1.py 123
执行结果:
15129
注意这里的代码指定了一个位置参数square,并且指定类型为int。
默认情况下,如果没有指定类型,argparse会将参数作为字符串存储。
也就是说,,如果没有指定类型,args.square的值是字符串'123'。
此时,在执行 args.square**2 的操作时,会报错。
5. 指定可选参数
先看代码:
- import argparse
- parser = argparse.ArgumentParser()
- parser.add_argument("--verbosity")
- args = parser.parse_args()
- print('可选参数verbosity的值是{}'.format(args.verbosity))
执行代码:
python 1.py --verbosity 123
执行结果:
可选参数verbosity的值是123
注意,在参数前加上前缀--,即意味着这个参数是可选参数。
可选参数与位置参数有两点不同:
第一,可选参数可以不指定,如果这样执行代码:
python 1.py
则执行结果为:
可选参数verbosity的值是None
注意此时的,verbosity的值是None。
第二点不同,可选参数使用时,需要先声明该参数,再指定该参数的值。
正如上面代码中使用的那样。读者可以自行体会。
6. 设定无需具体值参数
比如说我们想要设定一个参数,如果指定了该参数,就执行一个功能,
如果没指定,则不执行。具体该参数的值是多少在所不问。
代码如下:
- import argparse
- parser = argparse.ArgumentParser()
- parser.add_argument("--verbose", action="store_true")
- args = parser.parse_args()
- print("参数verbose的值是{}".format(args.verbose))
执行代码:
python 1.py --verbose
执行结果:
参数verbose的值是True
可以看到,在执行代码时,指定了可选参数--verbose,但是没有指定verbose的值。
此时verbose的值就默认为布尔值True。
实现这一目的的方法是将action参数的值指定为 "store_true"。
通过这个特点,就可以实现使用某一个特定功能这个目的。
7. 设定参数的简短形式
上面我们可以注意到,-h 是 --help 和简单形式,二者功能相同。
我们也可以为自己设定的参数指定简短的形式。
代码为:
- import argparse
- parser = argparse.ArgumentParser()
- parser.add_argument("-v","--verbose", action="store_true")
- args = parser.parse_args()
- print("参数verbose的值是{}".format(args.verbose))
执行代码:
python 1.py -v
执行结果:
参数verbose的值是True
说明,在可选参数前添加一个简短的参数,与直接使用原参数效果相同。
8. 同时添加位置参数和可选参数
代码如下:
- import argparse
- parser = argparse.ArgumentParser()
- parser.add_argument("square", type=int)
- parser.add_argument("-v", "--verbose", action="store_true")
- args = parser.parse_args()
- if args.verbose:
- print("the square of {} equals {}".format(args.square, args.square**2))
- else:
- print(args.square**2)
执行方式1:
python 1.py 50
执行结果1:
2500
执行方式2:
python 1.py 50 -v
执行结果2:
the square of 50 equals 2500
通过多次使用add_argument方法,来添加多个命令行参数。
9. 为可选参数设置取值范围
代码为:
- import argparse
- parser = argparse.ArgumentParser()
- parser.add_argument("-v", "--verbosity", type=int, choices=[0, 1, 2])
- args = parser.parse_args()
- print("可选参数verbosity的值为{}".format(args.verbosity))
多次不同方式执行代码:
MacBook-Pro:Desktop yao$ python 1.py
可选参数verbosity的值为None
MacBook-Pro:Desktop yao$ python 1.py -v 1
可选参数verbosity的值为1
MacBook-Pro:Desktop yao$ python 1.py -v 2
可选参数verbosity的值为2
MacBook-Pro:Desktop yao$ python 1.py -v 3
usage: 1.py [-h] [-v {0,1,2}]
1.py: error: argument -v/--verbosity: invalid choice: 3 (choose from 0, 1, 2)
说明,通过设置choices属性,来设置可选参数的取值范围。
如果不在取值范围内的话,会报错。
10. 监控可选参数的执行次数
代码如下:
- import argparse
- parser = argparse.ArgumentParser()
- parser.add_argument("-v", "--verbosity", action="count")
- args = parser.parse_args()
- print("可选参数verbosity的值为{}".format(args.verbosity))
以不同方式多次执行:
MacBook-Pro:Desktop yao$ python 1.py -v
可选参数verbosity的值为1
MacBook-Pro:Desktop yao$ python 1.py -vv
可选参数verbosity的值为2
MacBook-Pro:Desktop yao$ python 1.py -vvv
可选参数verbosity的值为3
MacBook-Pro:Desktop yao$ python 1.py -vvvv
可选参数verbosity的值为4
MacBook-Pro:Desktop yao$ python 1.py -vvvvv
可选参数verbosity的值为5
MacBook-Pro:Desktop yao$ python 1.py
可选参数verbosity的值为None
说明,通过设置action属性值为 'count' ,可以监控使用了多少次可选参数。
读者可自行根据执行结果感受该参数的作用。
11. 设置参数的默认值
代码为:
- import argparse
- parser = argparse.ArgumentParser()
- parser.add_argument("-v", "--verbosity", default=0)
- args = parser.parse_args()
- print("可选参数verbosity的值为{}".format(args.verbosity))
不同方式多次执行:
MacBook-Pro:Desktop yao$ python 1.py
可选参数verbosity的值为0
MacBook-Pro:Desktop yao$ python 1.py -v 100
可选参数verbosity的值为100
注意此时的默认值为0,而不是None
12 设置冲突参数
冲突参数是指,两个参数只能二选其一。
代码如下:
- import argparse
- parser = argparse.ArgumentParser()
- group = parser.add_mutually_exclusive_group()
- group.add_argument("-v", "--verbose", action="store_true")
- group.add_argument("-q", "--quiet", action="store_true")
- args = parser.parse_args()
- print("可选参数verbosity的值为{}".format(args.verbose))
- print("可选参数quiet的值为{}".format(args.quiet))
不同方式多次执行:
MacBook-Pro:Desktop yao$ python 1.py
可选参数verbosity的值为False
可选参数quiet的值为False
MacBook-Pro:Desktop yao$ python 1.py -v
可选参数verbosity的值为True
可选参数quiet的值为False
MacBook-Pro:Desktop yao$ python 1.py -q
可选参数verbosity的值为False
可选参数quiet的值为True
MacBook-Pro:Desktop yao$ python 1.py -v -q
usage: 1.py [-h] [-v | -q]
1.py: error: argument -q/--quiet: not allowed with argument -v/--verbose
MacBook-Pro:Desktop yao$ python 1.py -h
usage: 1.py [-h] [-v | -q]
optional arguments:
-h, --help show this help message and exit
-v, --verbose
-q, --quiet
请读者根据执行结果自行思考冲突参数的设置以及特点。
argparse模块入门介绍——基于python3.7的更多相关文章
- Nodejs基础:stream模块入门介绍与使用
本文摘录自<Nodejs学习笔记>,更多章节及更新,请访问 github主页地址.欢迎加群交流,群号 197339705. 模块概览 nodejs的核心模块,基本上都是stream的的实例 ...
- Python 基于python操纵redis入门介绍
基于python操纵redis入门介绍 by:授客 QQ:1033553122 测试环境 redis-3.0.7 CentOS 6.5-x86_64 python 3.3.2 基于Python操作R ...
- 基于python3.x,使用Tornado中的torndb模块操作数据库
目前Tornado中的torndb模块是不支持python3.x,所以需要修改部分torndb源码即可正常使用 1.开发环境介绍 操作系统:win8(64位),python版本:python3.6(3 ...
- 基于Metronic的Bootstrap开发框架--工作流模块功能介绍(2)
本篇继续<基于Metronic的Bootstrap开发框架--工作流模块功能介绍>,继续介绍基于Metronic的Bootstrap开发框架的工作模块功能,介绍工作流模块中相关业务表单的界 ...
- 基于Metronic的Bootstrap开发框架--工作流模块功能介绍
在很早之前的随笔里面,已经介绍了WInform框架中工作流模块的功能,不过由于工作流模块中界面处理部分比较麻烦,一直没有在Bootstrap框架中进行集成,最近由于项目的关系,花了不少精力,把工作流模 ...
- Python的Argparse模块是什么?(未完)
近日在阅读代码的过程中遇到了Argparse模块,记得前段时间已经看了,可是过了两周现在又忘了, 看来写代码一定要钻研到底搞清楚其中原委才行,本文主要参考Python3.6系列官方文档 ...
- Python入门介绍
Python入门介绍(人生苦短,我用 Python) Python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹 ...
- Python的Argparse模块是什么?
近日在阅读代码的过程中遇到了Argparse模块,记得前段时间已经看了,可是过了两周现在又忘了, 看来写代码一定要钻研到底搞清楚其中原委才行,本文主要参考Python3.6系列官方文档 ...
- [Python爬虫] scrapy爬虫系列 <一>.安装及入门介绍
前面介绍了很多Selenium基于自动测试的Python爬虫程序,主要利用它的xpath语句,通过分析网页DOM树结构进行爬取内容,同时可以结合Phantomjs模拟浏览器进行鼠标或键盘操作.但是,更 ...
随机推荐
- 利用UncaughtExceptionHandler捕获未try...catch到的异常
public class test { public static void main(String[] args){ Thread thread = new Thread(new MyThread( ...
- 树、递归、广度优先搜索(BFS)————二叉树的最小深度
解法一:递归 遇到叶子节点不递归,否则接着往子树递归,每次递归层数加1 要确定的是,一定要保证初始输入的节点是有子节点的.因为可能出现只有单子树的情况,所以要先确认这种情况. 具体过程: 1.分析初始 ...
- 使用jd-gui+javassist修改已编译好的class文件
1.原因:因为公司代码管理不当导致源码丢失,只好已编译好的class文件进行修改 2.首先先在myeclipse中新建java项目并导入javassist 3.将需要修改的文件放到指定文件夹下 4.. ...
- NOIP2015 运输计划 (树上差分+二分答案)
---恢复内容开始--- 题目大意:给你一颗树,你可以把其中一条边的边权改成0,使给定的一些树链的权值和的最大值最小 把lenth定义为未修改边权时的答案 考虑二分答案,如果二分的答案成立,设修改成0 ...
- CMDB设计
CMDB(资产管理数据库) CMDB是所有运维工具的数据基础 CMDB包含的内容 用户管理,记录测试,开发,运维人员的用户表 业务线管理,需要记录业务的详情 项目管理,指定此项目用属于哪条业务线,以及 ...
- skimage的安装,scikit-image
在mac上面的安装: pip install -U scikit-image
- ZOJ 3556
终于做出来了,激动.... 这道题隐藏得深啊,但若推导下来,就变简单了. 首先,一个集合的子集的个数为2^n=s.注意了,题目求的是有序集合组,并且每个集合是可以重复使用的,怎么办呢?这就要想到多重集 ...
- 关于Servo项目中Rust代码行数的数据来源
我两个月之前的一篇博客<为什么我说Rust是靠谱的编程语言>(下面简称原文),在当中"6. 两个半大型成功案例"一节.我以前写道: Servo: 下一代浏览器渲染引擎( ...
- JavaSE入门学习24:Java面向对象补充
一Java中的Object类 Object类是全部Java类的父类.假设一个类没有使用extendskeyword明白标识继承另外一个类,那么这个类默认 继承Object类. public class ...
- Ruby学习笔记(一)
在做实验的时候,由于每次都要手工修改文件夹的名字,实在是给自己添了太多的麻烦,为了摆脱手工修改的困恼,于是产生了一个使用程序批量修改文件夹名字的好主意.为了最终实现这个目标,自然需要选择一种合适的脚本 ...