在 多个文件或者不同语言协同 的项目中,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] 官方介绍文档