通过字符串导入 Python 模块的方法详解
作者:青南 时间:2023-10-15 03:00:56
我们平时导入第三方模块的时候,一般使用的是 import 关键字,例如:
import scrapy
from scrapy.spider import Spider
但是如果各位同学看过 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 源代码中,我们可以找到 相关的代码 :
def load_object(path):
"""Load an object given its absolute object path, and return it.
object can be a class, function, variable or an instance.
path ie: 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware'
"""
try:
dot = path.rindex('.')
except ValueError:
raise ValueError("Error loading object '%s': not a full path" % path)
module, name = path[:dot], path[dot+1:]
mod = import_module(module)
try:
obj = getattr(mod, name)
except AttributeError:
raise NameError("Module '%s' doesn't define any object named '%s'" % (module, name))
return obj
根据这段代码,我们知道,它使用了 importlib 模块的 import_module 函数:
首先根据字符串路径最右侧的 . 把字符串路径分成两个部分,例如: Test.middlewares.LoggingRequestMiddleware 分成 Test.middlewares 和 LoggingRequestMiddleware
使用 import_module 导入左边的部分
从左边部分通过 getattr 获得具体的类
现在我们来测试一下。我们创建的测试文件结构如下图所示:
其中, pipelines.py 文件的内容如下图所示:
main.py 文件的内容如下图所示:
运行 main.py ,可以看到 pipelines.py 中的 Pipeline 类被成功执行了,如下图所示:
总结
以上所述是小编给大家介绍的通过字符串导入 Python 模块的方法详解,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
来源:https://juejin.im/post/5db2b8846fb9a0206e1fe20c
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
基于wxPython的GUI实现输入对话框(1)
![](https://img.aspxhome.com/file/2023/5/124805_0s.jpg)
python使用opencv进行人脸识别
![](https://img.aspxhome.com/file/2023/3/76863_0s.jpg)
Python实现生成对角矩阵和对角块矩阵
![](https://img.aspxhome.com/file/2023/5/105405_0s.png)
一文弄懂MySQL索引创建原则
![](https://img.aspxhome.com/file/2023/5/116755_0s.png)
python实操练习案例(一)
![](https://img.aspxhome.com/file/2023/6/115176_0s.png)
SQL面试题:求时间差之和(有重复不计)
Python中的sys.stdout.write实现打印刷新功能
![](https://img.aspxhome.com/file/2023/6/133866_0s.gif)
Ceph分布式存储集群Pool资源池简介及使用小结
python numpy中cumsum的用法详解
js实现无刷新监听URL的变化示例代码详解
安装pyecharts1.8.0版本后导入pyecharts模块绘图时报错: “所有图表类型将在 v1.9.0 版本开始强制使用 ChartItem 进行数据项配置 ”的解决方法
![](https://img.aspxhome.com/file/2023/4/109584_0s.png)
Python爬虫爬取ts碎片视频+验证码登录功能
![](https://img.aspxhome.com/file/2023/7/70207_0s.png)
python 实时遍历日志文件
详解如何在python中读写和存储matlab的数据文件(*.mat)
在Python中使用第三方模块的教程
深入浅析python3中的unicode和bytes问题
Mybatis出现ORA-00911: invalid character的解决办法
![](https://img.aspxhome.com/file/2023/9/65689_0s.png)
python通过paramiko复制远程文件及文件目录到本地
ant design中实现table的表格行的拖拽
![](https://img.aspxhome.com/file/2023/8/56628_0s.png)