今天在学习python网络编程时,书中将客户端和服务端放在同一个代码中,用命令行参数来分别运行,其中的命令行参数部分让我有些困惑,所以今天特地看了以下argparse模块以便以后记忆。
1.什么是命令行参数?
顾名思义,命令行参数就是在命令行中运行代码时输入的参数,那么它有什么用呢?
首先,它包含一些文件本身的基本信息。
创建一个名为’argparse_train.py’的文件
import argparse
parse=argparse.ArgumentParser()
parse.parse_args()
然后win+R键入cmd,找到文件路径,
python argparse_train.py --help
可以看到usage用法和底下的可选参数,因为我们还没有添加其他命令行参数,所以只有-h/–help这一个参数
下面就让我们来使用argparse模块使用命令行参数
2.argparse- 用于命令行选项,参数和子命令的解析器
标题是官方文档的chrome自动翻译,我觉得还是挺有道理的。
1.创建ArgumentParse对象:
class argparse.ArgumentParser(prog = None,
usage = None,
description = None,
epilog = None,
parents = [],
formatter_class = argparse.HelpFormatter,
prefix_chars =' - ',
fromfile_prefix_chars = None,
argument_default = None,
conflict_handler ='error',
add_help = True,
allow_abbrev = True )
可以看出参数有12个之多,看这些东西花费了我不少时间,也总结出其中较为有用的一些参数
1)prog:程序名称
prog参数是程序的名称,它在usage(用法)中会有显示,我们改变一下它的值看有什么反应。
在参数中加上prog,我们改成name。
parse=argparse.ArgumentParser(prog='name')
可以看出usage中的名称已经变了。
2)usage:用法
这个参数没有什么好说的,填入参数会覆盖本来的usage,本来的名字也会被覆盖。
3)description:描述
你可以对命令行参数进行描述,它们会出现于usage和optional arguments之间
parse=argparse.ArgumentParser(prog='name',description='How to use it')
4)parent:继承/共享一组参数
import argparse
parse=argparse.ArgumentParser(description='How to use it',add_help=False)#注意这里的add_help必须改为False,否则会因为下面的继承会有两个help从而报错
parse.add_argument('-age',type=int,default=20)
parse.add_argument('build',default='middle')
parse.add_argument('height',type=float)#添加了三个参数
args=parse.parse_args(['-age','20','middle','175'])
print(args)
sub_parse=argparse.ArgumentParser(parents=[parse],description="This is a example for the 'parent'")
sub_args=sub_parse.parse_args(['-age','25','high','200.0'])
print(sub_args)
输出
Namespace(age=20, build='middle', height=175.0)
Namespace(age=25, build='high', height=200.0)
可以看到我们并未为其添加参数,而可以直接给值,说明继承了上面parse的参数。
5)prefix_chars:前缀解释器
在一般的命令行语句中,一般用‘-’作为前缀,如‘-help’等;这是因为prefix_char参数默认值为’-’。改为其他值如’±/’,可以识别’+’,‘-’.’/‘作为前缀。
比如把上述程序中的值改为’+’,会显示:
argparse_train.py: error: argument -age: invalid int value: '-age'
6)fromfile_prefix_chars:
有时候有大量参数时,将参数保存在一个文件中灵活性更高,而该参数则可以指定一个符号,使之后赋值时识别文件。读取时每行视为一个参数。
import argparse,sys
with open('args.txt','w') as op:
op.write('-age\n555\nhigh\n183')
parse=argparse.ArgumentParser(description='How to use it',add_help=False,prefix_chars='-+=',fromfile_prefix_chars='~')
parse.add_argument('-age',type=int,default=20)
parse.add_argument('build',default='middle')
parse.add_argument('height',type=float,default='222')
args=parse.parse_args(['~args.txt'])
print(args)
输出为:
Namespace(age=555, build='high', height=183.0)
2.add_argument()方法
该方法用来添加命令行参数,完整参数如下
ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
参数也比较多,有几个比较有用。
1)name or flags:参数名称
分为位置参数和可选参数,位置参数是普通字符串,可选参数“-”加字符串。
2)action:指定与命令行参数相关的动作
如:store储存参数(默认值),store_true和store_false分别用于储存true和false,而store_const则是用来储存const关键字指定的内容,如:
在上面的代码中加入三行:
parse.add_argument('帅',action='store_true')
parse.add_argument('穷',action='store_false')
parse.add_argument('today',action='store_const',const='国庆')
输出:
Namespace(age=555, build='high', height=183.0, today='国庆', 帅=True, 穷=False)
另外,还有append和count参数,append将储存一个列表,只能用于可选参数,用于位置参数添加多个值时还需nargs=‘*’,而count则计算关键字参数出现的次数:
import argparse,sys
parse=argparse.ArgumentParser(prog='square',description='Return square of input')
parse.add_argument('--input',action='append')
parse.add_argument('-victory','-v',action='count')#count计算关键字参数出现次数
args=parse.parse_args('--input 1 --input 2 --input 3 --input 4 -vvvv'.split())
print(args)
for i in args.input:
print(int(i)**2,end=' ')
输出:
Namespace(input=['1', '2', '3', '4'], victory=4)
1 4 9 16
3)nargs
类似与正则表达式的规则:
nargs | 作用 |
---|---|
n(整数) | 将n个命令行中的参数收集到一个列表中,类似append |
? | 有参数值则带入,没有则为默认值,如果是可选参数,可能为const值 |
* | 所有的参数值都收集到一个列表中,不分位置参数还是可选参数 |
+ | 和*一样将参数都放入列表,只是没有参数时报错 |
REMAINDER | 将剩下的参数放入一个列表中 |
import argparse,sys
parse=argparse.ArgumentParser(prog='square',description='Return square of input')
parse.add_argument('input',nargs=4)
parse.add_argument('number',nargs='?',default='250')
parse.add_argument('victory',nargs=argparse.REMAINDER)
args=parse.parse_args(' 1 2 3 4 shuaideyipi 666 '.split())
print(args)
for i in args.input:
print(int(i)**2,end=' ')
输出:
Namespace(input=['1', '2', '3', '4'], number='250', victory=['666', 'shuaideyipi', '666'])
1 4 9 16
最好不要混用多个nargs参数,不然很有可能赋值的时候得不到你想要的结果。
4)const:常量
只有在有参数action=store_const或者append_const,及nargs=’?'时const指定的值将存入变量中,其它情况const默认为None。
5)default:默认值
默认值,对于一些本来就有值的变量,可以通过在该方法中设置default参数的值来确定默认值,需要修改时直接赋值即可。
6)type:类型
是命令行参数的类型,默认为str,可以改为需要的格式。除了常用的几个类型外,type还支持自己定义的类型,官方文档上有这么一段代码:
import argparse,math
def perfect_square(string):
value = int(string)
sqrt = math.sqrt(value)
if sqrt != int(sqrt):
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'])
parser.parse_args(['7'])
输出:
usage: PROG [-h] foo
PROG: error: argument foo: '7' is not a perfect square#即为自己定于的类型
7)choices
有些时候我们希望在有限的几个参数中进行选择,choices提供了这个功能,即提供可选的参数值,填入参数列表中,在可选参数之外的值将报错。
import argparse
parse=argparse.ArgumentParser(prog='me',description='Hi')
parse.add_argument('Appearence',choices=['帅','贼帅','相当帅'])
args=parse.parse_args('丑')
print(args)
输出:
usage: me [-h] {帅,贼帅,相当帅}
me: error: argument Appearence: invalid choice: '丑' (choose from '帅', '贼帅', '相当帅')
8)required:必要
通过在可选参数中将required设置为True可以将可选参数转化为必要参数,不赋值将报错。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--foo', required=True)
parser.parse_args([])
输出:
usage: argparse.py [-h] [--foo FOO]
argparse.py: error: option --foo is required
9)help:帮助
相当于之前的description,可以写上注释啥的。会在用户请求帮助时显示在各参数的后面。