argparse模块-程序员宅基地

技术标签: python  

argparse模块

argparse模块是python的一个命令行解析包,可以直接让我们在命令行向程序中传入参数和修改参数,argparse模块内置于python中,不需要另外安装

试想在一个project中,我们有5个参数(p1,p2,p3,p4,p5),有两个py文件,其中py1用到了(1,2,3,4),py2用到了(1,2,3,5)但是在py1和py2中我们的参数p3的值不同。如果我们不用argparse模块,首先,我们需要在两个文件中分别定义各自的参数以及相应的值,然后运行,每次我们修改参数值的时候都需要进入到程序中进行修改,修改不便。其次,我们需要在两个文件中分别定义参数,相当于参数1,2,3多定义了一次。当我们用argparse模块时,上述的五个参数只需要定义一次,且当某个参数需要修改时我们只需要在命令行中给出他的修改值就可以了

一、基本用法

argparse官方文档

构建argparse模块主要分为四步:

  1. 导入argparse模块
  2. 创建ArgumentParser对象:ArgumentParser对象包含将命令行解析成python数据类型所需的全部信息
  3. 添加参数:给上述创建的对象添加参数,调用add_argument()方法
  4. 解析参数:将上述添加的参数进行解析,调用parse_args()方法

下面展示一个简单的例子

import argparse  # 1. 导入argparse模块
parser = argparse.ArgumentParser()  # 2. 创建ArgumentParser对象
parser.add_argument("number", help="请输入数字", type=int)  # 3. 添加参数
parser.add_argument("str", help="请输入字符串", type=str)
args = parser.parse_args()  # 4. 解析参数
print(args.number+10)
print(args.str)
'''
运行python example.py
---------------------
usage: example.py [-h] number str
example.py: error: the following arguments are required: number, str


运行python example.py -h
-------------------------
usage: example.py [-h] number str
 positional arguments:
   number      请输入数字
   str         请输入字符串
 optional arguments:
   -h, --help  show this help message and exit


运行python example.py  5 hello, world
------------------------------------
15
hello,world
'''

python example.pynumber和str是必须赋值的变量,不赋值会产生错误提示(在参数前加上- - 变为可选参数)

python example.py -h查看提示信息

python example.py 5 hello, world正确赋值,成功运行

此时我们print(args),输出为:Namespace(number=5, str='hello,world'),可以看出args是Namespace数据类型,它是一种类似于字典的数据类型,我们可以使用args.param来提取这个参数,例如args.number

补充: add_argument()中有一些参数,其中help是对参数的解释说明,type是变量的类型,下面还会介绍更多的参数

二、几个常用参数

1. 可选参数(–)与默认值(default)

上述的number和str都是位置参数(positional argument)也就是必选,若要变为可选参数,只需要在变量前加--即可

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("--number", help="请输入数字", type=int)
parser.add_argument("--str", default="hello,world", help="请输入字符串", type=str)
args = parser.parse_args()
print(args)
'''
运行python example2.py
----------------------
Namespace(number=None, str='hello,world')


运行python example2.py --number=2 --str="nihao"
----------------------------------------------
Namespace(number=2, str='nihao')
'''

参数中default为默认值,即没有给变量赋值时的默认值

如果我们想把可选参数变为必选,只需要在相应的语句中加入“required=True”即可,例如上述number必须提供一个数值的话parser.add_argument("--number", type=int, required=True, help="请输入数字"),此时如果在命令行中运行的时候不给number提供参数就会报错

2. action

action是一种新的赋值方式,主要决定参数为True or False

action=‘store_true’,在运行时指定了该参数他就为True,否则为False

# example.py
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--t', help=' ', action='store_true')
opt = parser.parse_args()
print(opt.t)
'''
python example.py 
-----------------
False


python example.py --t 
---------------------
True

'''

3. metavar

metavar用来控制命令行参数的显示,并且只影响相应参数的显示信息,不影响代码内部获取命令行参数的对象,例如

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--foo', metavar="xxx", help="a number to Sam")
parser.add_argument('bar', metavar="yyy")
parser.parse_args('X --foo Y'.split())
parser.print_help()
'''
python metavar.py
-----------------
usage: a.py [-h] [--foo xxx] yyy
positional arguments:
  yyy
optional arguments:
  -h, --help  show this help message and exit
  --foo xxx   a number to Sam
'''

可以看到输出中–foo后面出了help信息还多了xxx也就是metavar中的内容,这会让帮助信息更好看些

除此之外,对于有nargs参数的命令行参数,可以用metavar设置每一个具体参数的名称(用元祖将多个参数合并)

import argparse

parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('-x', nargs=2)
parser.add_argument('--foo', nargs=2, metavar=('bar', 'baz'))
parser.print_help()
'''
python metavar.py
-----------------
usage: PROG [-h] [-x X X] [--foo bar baz]
 optional arguments:
   -h, --help     show this help message and exit
   -x X X
   --foo bar baz
'''

此时–foo后面多了bar和baz两个参数,用来解释给–foo输出的参数名字

4. dest

dest顾名思义,就是目的的意思。加入了此参数后,不论原变量是什么,最终都会变为dest的值。我们先介绍两个关于位置参数和可选参数的例子

上述的可选参数“–param”或者位置参数“param”实际上在被赋值时都是在向add_argument()方法中的dest关键字进行赋值,即虽然我们没有指定dest这个变量,但是我们对param进行赋值之后,dest的名字就是param,也就是参数名的归宿就是dest

下面举例说明

>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument("--a")
_StoreAction(option_strings=['--a'], dest='a', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)

可以看到我们指定了一个可选参数a,并没有指定其他参数,在下面的StoreAction中看到只有dest的值变了且为a,也就是说dest就是参数名的最终归宿,如果我们提前指定了dest=b,那么即使我们对a赋值,最终参数空间也没有a,而是b。例如

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-f', '--foo-bar', '-foo')
parser.add_argument('-x', '-y')
a = parser.parse_args('-f 1 -x 2'.split())
print(a)
b = parser.parse_args('--foo 1 -y 2'.split())
print(b)
'''
Namespace(foo_bar='1', x='2')
Namespace(foo_bar='1', x='2')
'''

理解上述程序首先需要理解参数的优先级。可选参数(带有“–”)具有最高的赋值优先级,即不论我们对语句中的哪个参数进行赋值,最终都是赋值给了第一个带有(–)的参数;如果参数全都是只有一个(-),那么就赋值给第一个带有(-)的参数

看上述例子,我们对-f进行赋值,但是因为他的优先级比--foo-bar低,因此最终的dest为foo-bar

在知道add_argument()方法可以有多个参数以及最终不论哪个参数最终都是赋值给方法中的dest变量之后,我们就可以直接在方法中提供dest参数作为我们的最终变量,但是在给参数进行赋值时还是需要带有(–)的变量,例如下面程序,我们在赋值时只能够对moo进行赋值,但是在最终的Namespace空间中的的参数是bar

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--moo', dest='bar')
a = parser.parse_args('--moo 3'.split())
print(a)
parser.print_help()
'''
Namespace(bar='3')  # 参数空间的dest的值,即bar
 usage: metavar.py [-h] [--moo BAR]
 optional arguments:
   -h, --help  show this help message and exit
   --moo BAR
'''

最后我们用一个程序来加深对metavar和dest参数的理解
从输出中我们可以看出,help是对参数的简介,metavar也只起到对参数number的解释作用,并不会真正影响到我们最终得到的number变量的名字,而dest不一样,他不仅起到了对参数string的解释作用,并且最终还会替换掉string成为我们最终得到的number_no变量

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--number', metavar="number_yes", help="a number we need")
parser.add_argument('--string', dest='number_no')
a = parser.parse_args('--number 1 --number 3'.split())
print(a)
b = parser.parse_args('--number 1 --string 3'.split())
print(b)
parser.print_help()
'''
Namespace(number='3', number_no=None)
Namespace(number='1', number_no='3')
usage: exe.py [-h] [--number number_yes] [--string NUMBER_NO]

optional arguments:
  -h, --help           show this help message and exit
  --number number_yes  a number we need
  --string NUMBER_NO
'''
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_41978699/article/details/120747922

智能推荐

wsl2 kali 安装报错 WslRegisterDistribution failed with error: 0x80004005-程序员宅基地

文章浏览阅读5.5k次,点赞13次,收藏13次。修改注册表解决 wsl2 kali 安装报错 0x80004005_wslregisterdistribution failed with error: 0x80004005

HTML元素随滚动条滚动-程序员宅基地

文章浏览阅读1.4k次。比较常见的是一个Div层随滚动条滚动,使Div层位置相对于可视区域不变,其实质就是当滚动条位置改变后,重新定位层的位置。网上有不少的例子,总的思路可以分为两类:1.CSS样式定位。不同的浏览器及其版本,实现稍有不同。这种方式是利用CSS的expression特性,通过执行绑定的一个计算坐标位置的js表达式,把结果设置为层的坐标值,最终实现Div层位置的滚动。2.Javascript定位。使..._html页面内容随着滚轮

将程序移植到64位Windows-程序员宅基地

文章浏览阅读189次。雷立辉整理简介:本文对如何将32位Windows程序平滑的支持和过渡到64位Windows操作系统做出了一个简单而系统的介绍。包括对于64位操作系统的版本,编程模型,一些移植原则甚至包括对驱动程序的移植原则的介绍。作者介绍:系统分析员,现在在北京工作。作者的blog:http://goooder.blogchina.com.前言:或许大家还对32位的CPU及操作系统使用还是觉得非常的合乎..._conversion from 'int' to 'pvoid' of greater size

python和java哪个更有前景,java和python哪个好知乎-程序员宅基地

文章浏览阅读841次,点赞14次,收藏7次。说到底,Python只是一门工具而已,纯Python的工作几乎没有,上面提到的那几个领域,每个领域需要掌握的知识点,绝对是Python的几倍以上,只会Python的话还是洗洗回去睡觉吧。其实这也很好理解,这就好比,你学会用铅笔很简单,但你仅仅会用铅笔是绝对找不到素描的工作,因为你要画好一幅素描的话就需要懂一些素描相关的技法,而铅笔的使用只是非常非常基础的能力而已。当然了,如果你后面又考研了,又去深入学习了数学,那么果断去做人工智能/机器学习/数据分析等等新兴的工作,竞争比较小,工资又高,何乐而不为?

(转)Android Bander设计与实现 - 设计篇_openbander-程序员宅基地

文章浏览阅读625次。关键词Binder Android IPC Linux 内核 驱动摘要Binder是Android系统进程间通信(IPC)方式之一。Linux已经拥有管道,system V IPC,socket等IPC手段,却还要倚赖Binder来实现进程间通信,说明Binder具有无可比拟的优势。深入了解Binder并将之与传统IPC做对比有助于我们深入领会进程间通信的实现和性能优化。本_openbander

Hashtable与HashMap的区别_hashmap效率高于hashtable-程序员宅基地

文章浏览阅读411次,点赞5次,收藏5次。Hashtable与HashMap的区别 HashMap不是线程安全的,HashTable是线程安全。 HashMap允许空(null)的键和值(key),HashTable则不允许。 HashMap性能优于Hashtable。 Map1.Map是一个以键值对存储的接口。Map下有两个具体的实现,分别是HashMap和HashTable.2.Ha_hashmap效率高于hashtable

随便推点

Unity开发移动端相机的优缺点分析_unity 相机多了会有坏处吗-程序员宅基地

文章浏览阅读7.2k次。它对相机硬件不是太“了解” 用它的API,3000块钱的手机和500块钱的手机的拍照效果相差不大。造成这种差异的原因是,unity的相机方面的API,他没有获取相机参数的方式,对于相机的硬件设备,它只是单方面的要求,没有互动,它的模式是,我需要什么样的图片,那么我就要求相机返回什么样的图片给我,而不关心它是否真的能有能力返回给我。通俗的讲就是,在它看来,哈士奇和泰迪都是狗,它们没有任何区别。_unity 相机多了会有坏处吗

快速集成iOS基于RTMP的视频推流-程序员宅基地

文章浏览阅读56次。来源:Monkey_ALin链接:http://www.jianshu.com/p/8ea016b2720e效果图iTools有点卡, 但是推到服务器倒是很快的.推流前言这篇blog是iOS视频直播初窥:的一个补充. 因为之前传到github上的项目中没有集成视频的推流.有很多朋友简信和微博上问我..._ios rtmp 推流demo

Flutter组件--Slivers的基本使用_sliverfixedextentlist-程序员宅基地

文章浏览阅读839次。我们考虑一个这样的布局:一个滑动的视图中包括一个标题视图(HeaderView),一个列表视图(ListView),一个网格视图(GridView)。我们怎么可以让它们做到统一的滑动效果呢?使用前面的滚动是很难做到的。Flutter中有一个可以完成这样滚动效果的Widget:CustomScrollView,可以统一管理多个滚动视图。在CustomScrollView中,每一个独立的,可滚动的Widget被称之为Sliver。_sliverfixedextentlist

View 事件传递,分发与拦截_view 事件包含阻止传递-程序员宅基地

文章浏览阅读336次。目录[-]1、基础知识2、传递流程1、基础知识(1) 所有 Touch 事件都被封装成了 MotionEvent 对象,包括 Touch 的位置、时间、历史记录以及第几个手指(多指触摸)等。(2) 事件类型分为 ACTION_DOWN, ACTION_UP, ACTION_MOVE, ACTION_POINTER_DOWN, ACTION_POI_view 事件包含阻止传递

[爬虫]爬取搜狗的词库-程序员宅基地

文章浏览阅读277次。同学要做用户搜索词意图分析,要用到分词,让我给写一个爬虫爬取搜狗词库的脚本。以前爬取网页都使用正则匹配,想要用美丽的汤很久了,正好借此机会体验一下它的强大威力。脚本对搜狗词库主页进行一级爬取结果,然后对每一个分类进行二级页面爬取,然后获取该分类下的词库文件,保存到执行脚本同目录的1文件夹下。python还是新手一个,要是对有帮助的同学尽管拿去。#coding=utf-8'''Created..._c# 爬取搜狗词库

C++的I/O(vc版)(四)_uflow和underflow的区别-程序员宅基地

文章浏览阅读1.3k次。下面进行我们的第二大类,流缓冲类。stream并不负责写或者读,毕竟如它原本的目的一样:负责格式化,存储格式化信息;当然我们还用它存储状态信息等等。stream把它的读写工作转交给stream buffer,即缓冲区类。缓冲区类主要是围绕着位置展开操作,下面先介绍一个与位置有关的类:/*fpos:它可以存储还原任何流中的任意文件的位置指示器所需的所有信息 * 对象的类 fpos_uflow和underflow的区别