argparse模块
基本用法
import argparse
parser = argparse.ArgumentParser()
parser.add_argment('-v', '--Verbose', help='Help Text', type=str, action='store', ...)
args = parser.parse_args()
print(args.v)
ArgumentParser类的常用参数
- prog: 程序的名称(默认是: sys.argv[0])
- usage: 程序使用方法说明 (默认由自动生成)
- description: 程序的介绍
- epilog: 程序的补充介绍, 该文字在参数介绍后边
- prefix_chars: 定义optional参数的前缀,默认是'-'和'--', 如果我们设置 prefix_char='-+', 那么我们可以定义以'+'或'++'为前缀的optional参数.
- allow_abbrev: 允许对长可选参数进行缩写(默认值), 例如:你定义了'--verbose',那么在CLI中--ver等价于--verbose, 可以通过设置allow_abbrev=False禁用缩写.
add_argument()方法
该方法是用来向ArgumentParser类对象中加入参数的, 加入的参数可以是位置参数可以是 可选参数 也可以是标记
add_argument()的参数包括:
> name or flags - Either a name or a list of option strings, e.g. foo or -f, --foo.
> action - The basic type of action to be taken when this argument is encountered at the command line.
> nargs - The number of command-line arguments that should be consumed.
> const - A constant value required by some action and nargs selections.
> default - The value produced if the argument is absent from the command line.
> type - The type to which the command-line argument should be converted.
> choices - A container of the allowable values for the argument.
> required - Whether or not the command-line option may be omitted (optionals only).
> help - A brief description of what the argument does.
> metavar - A name for the argument in usage messages.
> dest - The name of the attribute to be added to the object returned by parse_args().
Name or Flags
位置参数(positional arguments)
代码示例
parser.add_argument('hostname', help='server host name', type=str)
可选参数(optional arguments)
代码示例
parser.add_argument('-p', '--port', help='the port number', type=int)
Action
-
store
这是默认值, 仅仅是把可选参数的值进行存储import argparse parser = argparse.ArgumentParser() parser.add_argument('-a', '--address', help='server address', type=str, action='store') args = parser.parse_args() print(args.address) OUTPUT: [LiangZhang@MacBook test]$python3 arguments.py -a 19.1.1.1 19.1.1.1
-
store_const
这个action通常配合const参数一起使用,为可选参数设置默认值,把可选参数作为标记使用.import argparse parser = argparse.ArgumentParser() parser.add_argument('-t', '--test', help='test store_const action', action='store_const', const=80) args = parser.parse_args() print(args.test) OUTPUT: [LiangZhang@MacBook test]$python3 arguments.py -t 80
-
store_true | store_false
这两个action和'store_const'类似, 不过不需要配合const参数, store_true就是为指定可选参数设置True, store_false就是为指定的可选参数设置Falseimport argparse parser = argparse.ArgumentParser() parser.add_argument('-p','--passed', help='passed the exam or not', action='store_true') parser.add_argument('-f', '--fail', help='fail in the exam or not', action='store_false') args = parser.parse_args() print(args.passed, args.fail) OUTPUT: [LiangZhang@MacBook test]$python3 arguments.py False True [LiangZhang@MacBook test]$python3 arguments.py -p -f True False [LiangZhang@MacBook test]$python3 arguments.py -p True True [LiangZhang@MacBook test]$python3 arguments.py -f False False
-
append
这个参数主要用于同一个可选参数使用多次时, 可以把这些参数的值放入一个列表.import argparse parser = argparse.ArgumentParser() parser.add_argument('-p','--port', help='ports', type=int, action='append') args = parser.parse_args() print(args.port) OUTPUT: [LiangZhang@MacBook test]$python3 arguments.py -p 21 -p 23 -p 80 [21, 23, 80]
-
append_const
这个action的作用是 把多个具有默认值的可选标记的值存放到一个列表import argparse parser = argparse.ArgumentParser() parser.add_argument('-w','--web', dest='var_list', action='append_const', const=80) parser.add_argument('-t', '--telent', dest='var_list', action='append_const', const=21) #参数dest指定所追加的参数值存入的列表名 args = parser.parse_args() print(args.var_list) #var_list容纳参数的列表名, 由dest=var_list定义 OUTPUT: [LiangZhang@MacBook test]$python3 arguments.py -t -w [21, 80] [LiangZhang@MacBook test]$python3 arguments.py -tw [21, 80] [LiangZhang@MacBook test]$python3 arguments.py -wt [80, 21]
-
count
用于统计某一可选标记出现次数import argparse parser = argparse.ArgumentParser() parser.add_argument('-v', '--verbose', action='count') args = parser.parse_args() print(args.verbose) OUTPUT: [LiangZhang@MacBook test]$python3 arguments.py -v 1 [LiangZhang@MacBook test]$python3 arguments.py -vvv 3 [LiangZhang@MacBook test]$python3 arguments.py -v -v 2
-
version
用于显示当前程序版本import argparse parser = argparse.ArgumentParser() parser.add_argument('-v', '--version', action='version', version='%(prog)s 2.0') args = parser.parse_args() print(args.version) OUTPUT: [LiangZhang@MacBook test]$python3 arguments.py -v arguments.py 2.0
nargs
用于指定某位置参数或可选参数能接受参数值的个数.
-
nargs=N (N为参数个数)
import argparse parser = argparse.ArgumentParser() parser.add_argument('-p', '--ports', help='port list', nargs=3) parser.add_argument('-t', '--type', help='protocol type', nargs=2) parser.add_argument('host', help='host address', nargs=2) args = parser.parse_args() print(args.ports, args.type, args.host) OUTPUT: [LiangZhang@MacBook test]$python3 arguments.py -p 23 22 53 -t tcp udp 192.168.1.1 www.baidu.com ['23', '22', '53'] ['tcp', 'udp'] ['192.168.1.1', 'www.baidu.com']
-
nargs='?' (只接收一个参数)
-
当nargs为'?'时, 代表该位置参数或可选参数只接收一个参数值, 并且我们可以为位置参数设置默认值(default), 以及为可选参数设置默认值(default)和常量值(const)
-
默认值和常量值的区别: 对于可选参数, 默认值指的是未给出可选参数标记(如:-p)时,该参数的值, 而常量值指的是给出可选参数标记(如: -p),但未给出参数值时,该可选参数的值.
-
注意: nargs=N时, 不可以为参数设置默认值和常量值, 所以nargs='?'是有意义的.
-
```python
parser = argparse.ArgumentParser()
parser.add_argument('host', nargs='?', default='www.cciex.com')
parser.add_argument('--port', '-p', nargs='?', const=23, default=22) #给出标记'-p' 不给值时 结果为'const', 如果 不给出标记'-p' 结果为'default'.
args = parser.parse_args()
print(args.port, args.host)
OUTPUT:
[LiangZhang@MacBook test]$ python3 arguments.py www.baidu.com -p 88
88 www.baidu.com
[LiangZhang@MacBook test]$
[LiangZhang@MacBook test]$python3 arguments.py -p
23 www.cciex.com
[LiangZhang@MacBook test]$
[LiangZhang@MacBook test]$python3 arguments.py
80 www.cciex.com
```
**args='?' 的常用方式**
这个参数用法,经常被用于可选的文件输入和输出
```python
import argparse
import sys
parser = argparse.ArgumentParser()
parser.add_argument('--infile', '-i', nargs='?', type=argparse.FileType('r'), default=sys.stdin)
parser.add_argument('--outfile', '-o', nargs='?', type=argparse.FileType('w'), default=sys.stdout)
args = parser.parse_args()
for line in args.infile:
print(line)
args.outfile.write(line)
print('Done!')
------------
OUTPUT:
[LiangZhang@MacBook test]$python3 arguments.py
both of input and output are not given^_^ #这是从标准输入输入的测试字符
both of input and output are not given^_^ #这是print()打印出的测试字符
both of input and output are not given^_^ #这是从标准输出输出的测试字符
Done! # 使用Ctl+D 终止输入
-------------
OUTPUT:
[LiangZhang@MacBook test]$python3 arguments.py --outfile test.txt #给定输出文件参数
this time --outfile has been specified ^_^ #这是从标准输入输入的测试字符 this time --outfile has been specified ^_^ #这是print()打印出的测试字符
Done! # 使用Ctl+D 终止输入
[LiangZhang@MacBook test]$
[LiangZhang@MacBook test]$cat test.txt #使用cat查看输出文件
this time --outfile has been specified ^_^ #输出文件内容等于输入
```
-
args='*' (接受所有参数)
所有参数全部被接收,并存入一个列表. 为多个位置参数使用'args="*" 没有意义.
如果没有给定任何参数值, 则返回空列表.import argparse import sys parser = argparse.ArgumentParser() parser.add_argument('-p', '--ports', nargs='*') parser.add_argument('host', nargs='*') args = parser.parse_args() print(args.host, args.ports) OUTPUT: [LiangZhang@MacBook test]$python3 arguments.py www.baidu.com www.cciex.com -p 23 22 80 ['www.baidu.com', 'www.cciex.com'] ['23', '22', '80']
-
args='+' (接受所有参数,要求至少有一个参数)
如果没有给定任何参数值,则生成异常.import argparse import sys parser = argparse.ArgumentParser() parser.add_argument('-p', '--ports', nargs='+') parser.add_argument('host', nargs='*') args = parser.parse_args() print(args.host, args.ports) OUTPUT: [LiangZhang@MacBook test]$python3 arguments.py www.baidu.com www.cciex.com -p 23 80 443 ['www.baidu.com', 'www.cciex.com'] ['23', '80', '443'] [LiangZhang@MacBook test]$ [LiangZhang@MacBook test]$python3 arguments.py www.baidu.com www.cciex.com -p #不给定参数返回异常 usage: arguments.py [-h] [-p PORTS [PORTS ...]] [host [host ...]] arguments.py: error: argument -p/--ports: expected at least one argument [LiangZhang@MacBook test]$ [LiangZhang@MacBook test]$python3 arguments.py www.baidu.com www.cciex.com #不给定标记 返回None ['www.baidu.com', 'www.cciex.com'] None
-
args=argparse.REMAINDER (把剩余的参数放入一个列表)
import argparse import sys parser = argparse.ArgumentParser() parser.add_argument('host', nargs=1, default='www.cciex.com') parser.add_argument('-p', '--ports', nargs='?', const=80, default=80) parser.add_argument('remains', nargs=argparse.REMAINDER) args = parser.parse_args() print(args.host, args.ports, args.remains) OUTPUT: [LiangZhang@MacBook test]$python3 arguments.py -p 443 www.baidu.com admin root mark ['www.baidu.com'] 443 ['admin', 'root', 'mark'] %%注意:%% args=argparse.REMAINDER的'吞噬能力'很强, 所以在CLI中输入参数时, 不要把可选参数放在REMAINDER之前, 否则连同可选参数标记(-p)和可选参数值(例:443),全部会被认定为剩余参数. OUTPUT2: [LiangZhang@MacBook test]$python3 arguments.py www.baidu.com -p 443 admin root mark ['www.baidu.com'] 80 ['-p', '443', 'admin', 'root', 'mark']
const (参数常量)
- 为可选参数设置参数常量值, 当在CLI中只给出了参数标记,但没有给出参数值时, 该常量为参数值, 代码样例见: Action章节的 'store_const' 和 'append_const'
default (参数默认值)
- 可以做为可选参数和位置参数的默认值, 当位置参数未给出,或是可选参数标记未给出, 那么参数值为默认值. 代码样例见: nargs='?' 等多处章节.
type (规定参数类型)
-
用于将CLI中输入的参数转换为指定的类型, 当类型无法转换时产生异常.
parser.add_argument('-p', '--port', type=int) #如果输入是非数字的字符,则产生异常
-
也可以用于将输入的字符做出文件名,返回文件句柄. 样例: 见 args='?' 常用方法章节.
-
也可以自定义类型转换函数.
def perfect_square(string): #用于测试一个参数是否能够被完全开平方 value = int(string) #转换输入为整型 sqrt = math.sqrt(value) #对输入开方 if sqrt != int(sqrt): #把平方根的值 和 int转换后的平方根对比, 如果一致说明平方根是整数, 原输入值可以被完全开方. msg = "%r is not a perfect square" % string raise argparse.ArgumentTypeError(msg) #如果不能被完全开方, 那么生成异常. return value #如果可以被完全开发, 返回转换为整型的原输入 parser = argparse.ArgumentParser(prog='PROG') parser.add_argument('foo', type=perfect_square) parser.parse_args(['9']) #模拟输入9, 测试OK Namespace(foo=9) parser.parse_args(['7']) #模拟输入7, 返回异常 usage: PROG [-h] foo PROG: error: argument foo: '7' is not a perfect square
choices
用于为位置参数或可选参数设限定一个范围.
import argparse
import sys
parser = argparse.ArgumentParser()
parser.add_argument('name', choices=['mark', 'Eric', 'Jonan'])
parser.add_argument('-f', '--food', choices=['Jiaozi', 'rice'])
args = parser.parse_args()
print(args.name, args.food)
OUTPUT:
[LiangZhang@MacBook test]$python3 arguments.py mark -f Jiaozi
mark Jiaozi
[LiangZhang@MacBook test]$python3 arguments.py mark -f shrimp #参数不在给定范围时,会给出错误提示.
usage: arguments.py [-h] [-f {Jiaozi,rice}] {mark,Eric,Jonan}
arguments.py: error: argument -f/--food: invalid choice: 'shrimp' (choose from 'Jiaozi', 'rice')
required
通常来讲, 诸如-f或--foo 一般被视为可选参数, 在CLI中可以添加也可以不加, 可以通过设置required=True 来指定该可选参数为必选参数.
parser = argparse.ArgumentParser()
parser.add_argument('--foo', '-f', required=True) #指定CLI中必须包含-f参数
args = parser.parse_args()
help
对参数的一个功能描述, 当用户使用-h时, 会显示该描述.
parser = argparse.ArgumentParser(prog='frobble')
parser.add_argument('--foo', action='store_true', help='foo the bars before frobbling')
metavar
用于自定义帮助信息(-h得到的输出)中的位置参数和可选参数的参数值的展示样例.
默认help输出中的位置参数的参数值示例直接使用位置参数名称, 可选参数的参数值样例则是把可选参数大写, 如下:
parser = argparse.ArgumentParser()
parser.add_argument('date', help='current date')
parser.add_argument('-f', '--food', help='your favorite food')
args = parser.parse_args()
print(args.date, args.food)
OUTPUT:
[LiangZhang@MacBook test]$python3 arguments.py -h
usage: arguments.py [-h] [-f FOOD] date #输出中的FOOD是可选参数的大写形式, 'date'直接使用位置参数名.
positional arguments:
date current date
optional arguments:
-h, --help show this help message and exit
-f FOOD, --food FOOD your favorite food
使用metavar之后的代码:
parser = argparse.ArgumentParser()
parser.add_argument('date', help='current date', metavar='YY-MM-DD')
parser.add_argument('-f', '--food', help='your favorite food', metavar='Food_Name')
args = parser.parse_args()
print(args.date, args.food)
OUTPUT:
[LiangZhang@MacBook test]$python3 arguments.py -h
usage: arguments.py [-h] [-f Food_Name] YY-MM-DD #Food_Name和YY-MM-DD均使用了自定义的示例名称
positional arguments:
YY-MM-DD current date
optional arguments:
-h, --help show this help message and exit
-f Food_Name, --food Food_Name
your favorite food
如果使用nargs参数后, 那么一个可选参数可能需要接受多个参数值, 这时我们可以为metavar传出一个元组, 为多个参数值设置示例名:
parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('-x', nargs=2)
parser.add_argument('--foo', nargs=2, metavar=('bar', 'baz'))
OUTPUT:
usage: PROG [-h] [-x X X] [--foo bar baz] #为--foo的两个参数值设置不同的示例名
dest
dest是一个argpars.ArgumentParser对象被解析以后, args引用参数值的变量名称.
默认:
- 位置参数的dest为位置参数的参数名
- 可选参数的dest为:
- 合规长参数去掉前缀'--', 如: --foo的dest为foo
- 不合规长参(参数名包含'-')数去掉前缀'--', 并且把参数名中的'-'变为' _ ', 例如: --food-name的dest为food_name.
- 如果没有长参数, 那么短参数去掉前缀'-', 如: -p的dest为p
例如:
parser.add_argument('date', help='current date', metavar='YY-MM-DD') #date为该参数的dest
parser.add_argument('-f', '--food-name', help='your favorite food', metavar='FoodName') #food_name为该参数的dest
args = parser.parse_args()
print(args.date, args.food_name) #date和food_name为 dest
可以使用dest参数自己定义dest名称
import argparse
import sys
parser = argparse.ArgumentParser()
parser.add_argument('-f', '--food', dest='snack', help='your favorite food',) #snack为--food的dest名称
args = parser.parse_args()
print(args.snack) #我们需要使用args.snack来引用参数--food的参数值.
网友评论