locust对应源码启动方式参数的剖析(4)

16 篇文章 11 订阅 ¥19.90 ¥99.00
本文介绍了Locust命令行启动时源码中的关键步骤,包括parse_locustfile_option、load_locustfile和parse_options函数。讲解了argparse模块在解析命令行参数及提供用户帮助的作用,并探讨了configargparse模块的parse_args方法,用于读取配置文件中的属性值并验证命令行参数的合法性。文章以实例说明了参数解析过程,并预告了后续内容。
摘要由CSDN通过智能技术生成

我们执行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键的值。

好了,我们下一章继续往下走。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值