通过字符串导入 Python 模块的方法详解
我们平时导入第三方模块的时候,一般使用的是import关键字,例如:
importscrapy fromscrapy.spiderimportSpider
但是如果各位同学看过Scrapy的settings.py文件,就会发现里面会通过字符串的方式来指定pipeline和middleware,例如:
DOWNLOADER_MIDDLEWARES={ 'Test.middlewares.ExceptionRetryMiddleware':545, 'Test.middlewares.BOProxyMiddlewareV2':543, } SPIDER_MIDDLEWARES={ 'Test.middlewares.LoggingRequestMiddleware':543, }
我们知道,这里的Test.middlewares.ExceptionRetryMiddleware实际上对应了根目录下面的Test文件夹里面的middlewares.py文件中的ExceptionRetryMiddleware类。那么Scrapy是如何根据这个字符串,导入这个类的呢?
在Scrapy源代码中,我们可以找到相关的代码:
defload_object(path): """Loadanobjectgivenitsabsoluteobjectpath,andreturnit. objectcanbeaclass,function,variableoraninstance. pathie:'scrapy.downloadermiddlewares.redirect.RedirectMiddleware' """ try: dot=path.rindex('.') exceptValueError: raiseValueError("Errorloadingobject'%s':notafullpath"%path) module,name=path[:dot],path[dot+1:] mod=import_module(module) try: obj=getattr(mod,name) exceptAttributeError: raiseNameError("Module'%s'doesn'tdefineanyobjectnamed'%s'"%(module,name)) returnobj
根据这段代码,我们知道,它使用了importlib模块的import_module函数:
首先根据字符串路径最右侧的.把字符串路径分成两个部分,例如:Test.middlewares.LoggingRequestMiddleware分成Test.middlewares和LoggingRequestMiddleware
使用import_module导入左边的部分
从左边部分通过getattr获得具体的类
现在我们来测试一下。我们创建的测试文件结构如下图所示:
其中,pipelines.py文件的内容如下图所示:
main.py文件的内容如下图所示:
运行main.py,可以看到pipelines.py中的Pipeline类被成功执行了,如下图所示:
总结
以上所述是小编给大家介绍的通过字符串导入Python模块的方法详解,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。