通过字符串导入 Python 模块的方法详解


Posted in Python onOctober 27, 2019

我们平时导入第三方模块的时候,一般使用的是 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 获得具体的类

现在我们来测试一下。我们创建的测试文件结构如下图所示:

通过字符串导入 Python 模块的方法详解 

其中, pipelines.py 文件的内容如下图所示:

通过字符串导入 Python 模块的方法详解  

main.py 文件的内容如下图所示:

通过字符串导入 Python 模块的方法详解 

运行 main.py ,可以看到 pipelines.py 中的 Pipeline 类被成功执行了,如下图所示:

通过字符串导入 Python 模块的方法详解 

总结

以上所述是小编给大家介绍的通过字符串导入 Python 模块的方法详解,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Python 相关文章推荐
Python压缩解压缩zip文件及破解zip文件密码的方法
Nov 04 Python
从源码解析Python的Flask框架中request对象的用法
Jun 02 Python
Python用list或dict字段模式读取文件的方法
Jan 10 Python
对numpy中的数组条件筛选功能详解
Jul 02 Python
带你认识Django
Jan 15 Python
Django框架模板语言实例小结【变量,标签,过滤器,继承,html转义】
May 23 Python
pytorch 模型可视化的例子
Aug 17 Python
简单易懂Pytorch实战实例VGG深度网络
Aug 27 Python
Flask项目中实现短信验证码和邮箱验证码功能
Dec 05 Python
pyqt5实现井字棋的示例代码
Dec 07 Python
Python绘制K线图之可视化神器pyecharts的使用
Mar 02 Python
详解Python+OpenCV进行基础的图像操作
Feb 15 Python
python实现树的深度优先遍历与广度优先遍历详解
Oct 26 #Python
python图的深度优先和广度优先算法实例分析
Oct 26 #Python
python单例模式原理与创建方法实例分析
Oct 26 #Python
Python aiohttp百万并发极限测试实例分析
Oct 26 #Python
python实现淘宝购物系统
Oct 25 #Python
DJANGO-URL反向解析REVERSE实例讲解
Oct 25 #Python
python计算n的阶乘的方法代码
Oct 25 #Python
You might like
php遍历数组的方法分享
2012/03/22 PHP
PHP中的替代语法介绍
2015/01/09 PHP
PHP学习笔记(三):数据类型转换与常量介绍
2015/04/17 PHP
jquery实现图片按比例缩放示例
2014/07/01 Javascript
javascript实现时间格式输出FormatDate函数
2015/01/13 Javascript
使用jQuery.form.js/springmvc框架实现文件上传功能
2016/05/12 Javascript
原生js仿淘宝网商品放大镜效果
2017/02/28 Javascript
Ext JS 实现建议词模糊动态搜索功能
2017/05/13 Javascript
JS实现微信摇一摇原理解析
2017/07/22 Javascript
Vue2.0父组件与子组件之间的事件发射与接收实例代码
2017/09/19 Javascript
微信小程序实现给嵌套template模板传递数据的方式总结
2017/12/18 Javascript
如何把vuejs打包出来的文件整合到springboot里
2018/07/26 Javascript
vue自定义switch开关组件,实现样式可自行更改
2019/11/01 Javascript
微信小程序批量上传图片到七牛(推荐)
2019/12/19 Javascript
[03:18]DOTA2放量测试专访820:希望玩家加入国服大家庭
2013/08/25 DOTA
[45:59]完美世界DOTA2联赛PWL S2 FTD vs GXR 第二场 11.22
2020/11/24 DOTA
Python实现矩阵转置的方法分析
2017/11/24 Python
Python操作Redis之设置key的过期时间实例代码
2018/01/25 Python
Python3利用print输出带颜色的彩色字体示例代码
2019/04/08 Python
Python OpenCV利用笔记本摄像头实现人脸检测
2020/08/20 Python
python爬虫刷访问量 2019 7月
2019/08/01 Python
基于python实现的百度新歌榜、热歌榜下载器(附代码)
2019/08/05 Python
python 实现方阵的对角线遍历示例
2019/11/29 Python
selenium设置浏览器为headless无头模式(Chrome和Firefox)
2021/01/08 Python
印尼值得信赖的在线交易网站:Bukalapak
2019/03/11 全球购物
建筑工程技术应届生自荐信
2013/09/27 职场文书
副校长个人对照检查材料思想汇报
2014/10/04 职场文书
党的群众路线教育实践活动个人对照检查材料(教师)
2014/11/04 职场文书
职代会闭幕词
2015/01/28 职场文书
学校重阳节活动总结
2015/03/24 职场文书
行政复议决定书
2015/06/24 职场文书
运动会闭幕式主持词
2015/07/01 职场文书
市语委办2016年第十九届“推普周”活动总结
2016/04/05 职场文书
详解vue身份认证管理和租户管理
2021/05/25 Vue.js
解决persistence.xml配置文件修改存放路径的问题
2022/02/24 Java/Android
iOS 16进一步确认,一共支持16款iPhone
2022/04/28 数码科技