如何通过字符串导入 Python 模块
我们平时导入第三方模块的时候,一般使用的是import
关键字,例如:
1 | import scrapy |
但是如果各位同学看过 Scrapy 的settings.py
文件,就会发现里面会通过字符串的方式来指定pipeline 和 middleware,例如:
1 | DOWNLOADER_MIDDLEWARES = { |
我们知道,这里的Test.middlewares.ExceptionRetryMiddleware
实际上对应了根目录下面的Test
文件夹里面的middlewares.py
文件中的ExceptionRetryMiddleware
类。那么 Scrapy 是如何根据这个字符串,导入这个类的呢?
在 Scrapy 源代码中,我们可以找到相关的代码:
1 | def load_object(path): |
根据这段代码,我们知道,它使用了importlib
模块的import_module
函数:
- 首先根据字符串路径最右侧的
.
把字符串路径分成两个部分,例如:Test.middlewares.LoggingRequestMiddleware
分成Test.middlewares
和LoggingRequestMiddleware
- 使用
import_module
导入左边的部分 - 从左边部分通过
getattr
获得具体的类
现在我们来测试一下。我们创建的测试文件结构如下图所示:
其中,pipelines.py
文件的内容如下图所示:
main.py
文件的内容如下图所示:
运行main.py
,可以看到pipelines.py
中的Pipeline
类被成功执行了,如下图所示: