【Python】命令行参数解析 argparse模块 详解

多个文件或者不同语言协同 的项目中,python 脚本经常需要从命令行直接读取参数

argparse 模块可以轻松 编写 用户友好的 命令行接口
程序定义它需要的参数,然后 argparse 将弄清如何 从 sys.argv 解析出那些参数。 argparse 模块还会 自动生成帮助和使用手册,并 在用户给程序传入无效参数时报出错误信息


argparse使用方法

使用主要有四个步骤:

  • import argparse # 导入模块
  • parser = argparse.ArgumentParser() # 创建 ArgumentParser() 对象
  • parser.add_argument() # 调用 add_argument() 方法添加你需要的参数和选项
  • parser.parse_args() # 使用 parse_args() 解析命令行中输入的参数

我们先来看个示例:

# -*- coding: utf-8 -*-
 
import argparse
 
parser = argparse.ArgumentParser()
parser.add_argument('integer', type=int, help='display an integer')
args = parser.parse_args()
 
print(args.integer)

将上面的代码保存为文件 argparse_usage.py,在终端运行,结果如下:

$ python argparse_usage.py
usage: argparse_usage.py [-h] integer
argparse_usage.py: error: too few arguments
 
$ python argparse_usage.py abcd
usage: argparse_usage.py [-h] integer
argparse_usage.py: error: argument integer: invalid int value: 'abcd'
 
$ python argparse_usage.py -h
usage: argparse_usage.py [-h] integer
 
positional arguments:
  integer     display an integer
 
optional arguments:
  -h, --help  show this help message and exit
 
$ python argparse_usage.py 10
10

添加参数

add_argument() 方法

ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])

参数很多,这边先给个简单的解释:

  • name or flags - 一个命名或者一个选项字符串的列表,例如 foo 或 -f, --foo。

  • action - 当参数在命令行中出现时使用的动作基本类型。

  • nargs - 命令行参数应当消耗的数目。

  • const - 被一些 action 和 nargs 选择所需求的常数。

  • default - 当参数未在命令行中出现时使用的值。

  • type - 命令行参数应当被转换成的类型。

  • choices - 可用的参数的容器。

  • required - 此命令行选项是否可省略 (仅选项可用)。

  • help - 一个此选项作用的简单描述。

  • metavar - 在使用方法消息中使用的参数值示例。

  • dest - 被添加到 parse_args() 所返回对象上的属性名。

参数类型

命令行参数可以分为 位置参数可选参数 两种。

可选参数(optional arguments)

可选择性填入,通过参数名传入。

添加方法:参数声明的参数名前缀带---,其中参数名前面加上(-),表示短参数,或者(–),表示长参数。比如:

parser.add_argument('-f', '--foo')

短参数即单字符名称,长参数即多字符名称,可以理解成给一个参数同时取了一长一短两个名字,这两个名字指的其实是同一个东西。两者可以都有,也可以只有一个。

不输入选项 的情况下取到的值是None,输入选项但是又没在后面写值而且也没默认值,则会出错。

位置参数(positional arguments)

必填参数。正如其名,根据位置顺序传入。

添加方法:参数声明的参数名不带---的前缀,也就是一个简单的参数名。比如:

parser.add_argument('bar')

parse_args()运行时,会用’-'来认证可选参数,剩下的即为位置参数。

一般可选参数用的更多。

可选参数 - 设为必须

如果需要,可以通过使用required=True,将可选参数设为必须输入。比如:

parser.add_argument('-v', '--verbose', help='increase verbosity', required=True)

可选参数 - 布尔值

一般使用选项参数的时候,必须在后面给这个参数赋值。

对于有时候对于简单程序,我们可能只需要一个标识而不需要一个确切的值,即True or False,比如-h 和 --help。这个可以通过使用 action="store_true" 来实现,比如:

parser.add_argument('-v', '--verbose', help='increase verbosity', action='store_true')

添加参数说明

设置关键参数help,来添加参数说明。比如:

parser.add_argument('echo', help='直接打印这个参数的值')

设置参数的数据类型

默认情况下,ArgumentParser 对象将命令行参数当作简单字符串读入。其它的类型,比如 float 或者 int,则通过关键参数type实现,比如:

parser.add_argument('echo', help='直接打印这个参数的值', type=int)

现在关键参数必须是数字,而且调用的时候显示的类型也是int类型了

定义默认值

可以通过设置默认值来解决不带参数启动的问题。比如:

parser.add_argument('echo', help='直接打印这个参数的值', type=int, default=0, nargs='?')

如果不跟参数,默认设置为default的值。这个用default='0’也是一样的哦,因为前面定义了type。但是如果没有定义type,那么用default=1的话传输的参数是int,但是你自己自定义参数的话,就无法传入int类型了。

参数候选值

使用choise关键参数,可以限定这个参数的值必须在候选的列表内。比如:

parser.add_argument('echo', choices=['a', 'b', 'c'], default='a', nargs='?')

这样只有输入正确才能正常执行,这里注意,如果有default,那么default的值也得在候选值之中。

帮助说明-h、–help

解析参数

ArgumentParser.parse_args(args=None, namespace=None)

parse_args()是对输入的参数字符串进行解析,给之前add_argument()定义的参数进行赋值,并返回填充好的namespace。

  • args - 要解析的字符串列表。默认值取自sys.argv。
  • namespace - 获取属性的对象。默认是一个新的空名称空间对象。

示例:

import argparse
import sys

parse=argparse.ArgumentParser()

parse.add_argument("--learning_rate",type=float,default=0.01,help="initial learining rate")
parse.add_argument("--max_steps",type=int,default=2000,help="max")
parse.add_argument("--hidden1",type=int,default=100,help="hidden1")

args = parser.parse_args()

print(args.hidden1)

args = parser.parse_args()其实就等同于arg=parse.parse_args(sys.argv[1:])

其中参数sys.argv[1:]是命令行语句中从第一个到最后。如在ubuntu下输入命令行python gg.py --learning_rate 20 --max_steps 10

则sys.argv[1:0]=–learning_rate 20 --max_steps 10

输出的arg为namespace空间,结果是Namespace(hidden1=100, learning_rate=20.0, max_steps=10)

Python命名空间namespace 的概念,另外再查一下资料


参考资料:

[1] 官方介绍文档

[2] python自学argparse模块

[3] python之Argparse模块

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值