我们执行locust常规都是直接在命令行输入locust执行,这里执行的就是...\python3\Scripts目录下的locust.exe文件。
它执行的就是源码里面的main函数。我们先看main执行的前三行
def main():
# find specified locustfile and make sure it exists, using a very simplified
# command line parser that is only used to parse the -f option
locustfile = parse_locustfile_option()
# import the locustfile
docstring, user_classes = load_locustfile(locustfile)
# parse all command line options
options = parse_options()
对应的三个关键方法就是parse_locustfile_option,load_locustfile,parse_options.
我们先讲解parse_locustfile_option:
def parse_locustfile_option(args=None):
"""
Construct a command line parser that is only used to parse the -f argument so that we can
import the test scripts in case any of them adds additional command line arguments to the
parser
"""
parser = get_empty_argument_parser(add_help=False)
parser.add_argument(
'-h', '--help',
action='store_true',
default=False,
)
parser.add_argument(
'--version', '-V',
action='store_true',
default=False,
)
options, _ = parser.parse_known_args(args=args)
locustfile = find_locustfile(options.locustfile)
if not locustfile:
if options.help or options.version:
# if --help or --version is specified we'll call parse_options which will print the help/version message
parse_options(args=args)
sys.stderr.write("Could not find any locustfile! Ensure file ends in '.py' and see --help for available options.\n")
sys.exit(1)
if locustfile == "locust.py":
sys.stderr.write("The locustfile must not be named `locust.py`. Please rename the file and try again.\n")
sys.exit(1)
return locustfile
这里主要是在命令行帮助增加了一个帮助和版本的参数,然后去寻找你的locustfile文件。并且该文件不能命名为locust.py。
我们就讲一下这里主要用到的模块argparse。
这个模块主要是用来从命令行解析参数以及给出用户帮助提示。我们先来一个简单的用法介绍:
import argparse
#首先我们申明一个parse解析器
parse = argparse.ArgumentParser(
description='neo教学说明', #description是一个简单的描述,在usage之后显示
usage='python版本3.8', #用法提示,放在最前面展示
prog='neo', #给你的程序起一个名词,这个会在后面转为一个dict,之后会介绍如何转为dict的,这里只需要记住,使用方法是"%(prog)s"来进行字典key-value使用。
add_help=True, #顾名思义,就是让程序自带help命令行参数。这样你就可以直接使用-h或者--help
来参看有哪些命令行参数
epilog='neo教学工具友情提示结束' #这个放在所有命令行参数介绍完了来一个总结的意思
)
#然后就是给解析器里面注入你主程序正儿八经想要的外置argv了
parse.add_argument('-p','--port',default=3306,type=int,help="该参数的使用说明")
#这里add_argument首先接收的是*args,然后是**kwargs,所以我们先指定了接收哪些参数('-p','--port',这2个都可以使用)
#然后是default,意思是如果我们不使用该参数,就默认传3306给后台,而且type指定了要传的值必须为int类型
parse.add_argument('-t','--time',type=str,required=True,metavar='别名',dest='属性名')
#required传入布尔值,为True时,相关参数必须传入
#metavar就是help里显示,不用就直接显示TIME(自动大写)
#dest就是你返回的Namespace里的各个属性名,以Namespace里属性形式调用,当然后面也可以使用vars方法把它转化为dict-like模式来使用。如果不指定它,就以'-'和'--'中指定的为属性名,当'-'和'--'同时存在,以'--'之后的为准,且没有metavar的时候,以dest为帮助文档里的别名,当dest和metavar都没有,别名规则与dest的属性值规则一致。
parse.add_argument('-m',action='store_true')#设置-m参数默认值为True,意思是传入-m 就默认返回True,不传-m就为False
args=parse.parse_args()#这里就返回一个Namespace
dictlike=vars(args)#转为dict-like
port = (dictlike.get('port',3306))#获取命令行传入值,这里我们又可以通过字典方法来设置默认值。
至于其他的一些参数,在locust里用不到,所以我们也就不继续讲解了。
下面要讲一下parse_args方法,因为在源码里频繁使用了它。
它属于configarparse模块。它是用来在你的配置文件里读取相应属性的值的。
在这里主要作用就是解析你的命令行参数,看你的命令行参数和传值是否和你之前添加的匹配,如果非法就会抛出异常:
if argv:
self.error('unrecognized arguments: %s' % ' '.join(argv))
这里通过parse_know_args方法把所有非法的参数都会提取出来存入列表argv里,如果该列表不为空,就会抛出异常结束进程。
接着看self.error的执行
def error(self, message):
"""error(message: string)
Prints a usage message incorporating the message to stderr and
exits.
If you override this in a subclass, it should not return -- it
should either exit or raise an exception.
"""
self.print_usage(_sys.stderr)
args = {'prog': self.prog, 'message': message}
print('message=',message)
self.exit(2, _('%(prog)s: error: %(message)s\n') % args)
这里有个关键,prog变成了字典。所有我们可以用%(prog)s格式化方法取出prog键的值。
好了,我们下一章继续往下走。