通过字符串导入 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中的二进制位运算符
May 13 Python
python 3.5下xadmin的使用及修复源码bug
May 10 Python
Python中的函数作用域
May 07 Python
Python实现聊天机器人的示例代码
Jul 09 Python
几个适合python初学者的简单小程序,看完受益匪浅!(推荐)
Apr 16 Python
Django框架文件上传与自定义图片上传路径、上传文件名操作分析
May 10 Python
python Web flask 视图内容和模板实现代码
Aug 23 Python
Python图像处理库PIL的ImageFont模块使用介绍
Feb 26 Python
浅谈Python中range与Numpy中arange的比较
Mar 11 Python
python使用for...else跳出双层嵌套循环的方法实例
May 17 Python
详解Python3.8+PyQt5+pyqt5-tools+Pycharm配置详细教程
Nov 02 Python
Python数据清洗工具之Numpy的基本操作
Apr 22 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中如何调用webservice的实例参考
2013/04/25 PHP
php伪静态之APACHE篇
2014/06/02 PHP
8个PHP数组面试题
2015/06/23 PHP
PHP使用 Imagick 扩展实现图片合成,圆角处理功能示例
2019/09/09 PHP
如何在centos8自定义目录安装php7.3
2019/11/28 PHP
js下用层来实现select的title提示属性
2010/02/23 Javascript
Jquery中获取iframe的代码
2011/01/11 Javascript
完美解决JS文件页面加载时的阻塞问题
2016/12/18 Javascript
ui-router中使用ocLazyLoad和resolve的具体方法
2017/10/18 Javascript
详解vue 组件之间使用eventbus传值
2017/10/25 Javascript
JavaScript数据结构之双向链表定义与使用方法示例
2017/10/27 Javascript
javaScript字符串工具类StringUtils详解
2017/12/08 Javascript
JS求Number类型数组中最大元素方法
2018/04/08 Javascript
利用d3.js力导布局绘制资源拓扑图实例教程
2019/01/08 Javascript
jQuery实现适用于移动端的跑马灯抽奖特效示例
2019/01/18 jQuery
详解VUE前端按钮权限控制
2019/04/26 Javascript
ES6中的class是如何实现的(附Babel编译的ES5代码详解)
2019/05/17 Javascript
解决vue自定义全局消息框组件问题
2019/11/22 Javascript
原生js+canvas实现下雪效果
2020/08/02 Javascript
[01:59]DOTA2首部纪录片《Free to play》预告片
2014/03/12 DOTA
Python二维码生成库qrcode安装和使用示例
2014/12/16 Python
Python中__name__的使用实例
2015/04/14 Python
Python编程使用*解包和itertools.product()求笛卡尔积的方法
2017/12/18 Python
利用Anaconda简单安装scrapy框架的方法
2018/06/13 Python
对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解
2018/06/28 Python
python,Django实现的淘宝客登录功能示例
2019/06/12 Python
django框架forms组件用法实例详解
2019/12/10 Python
150行Python代码实现带界面的数独游戏
2020/04/04 Python
python中threading和queue库实现多线程编程
2021/02/06 Python
css3 box-sizing属性使用参考指南
2013/01/08 HTML / CSS
Sephora丝芙兰泰国官方网站:国际知名化妆品购物
2017/11/15 全球购物
财务会计毕业生个人求职信
2014/02/03 职场文书
先进教师个人事迹材料
2014/12/15 职场文书
2015秋季开学典礼演讲稿
2015/07/16 职场文书
银行求职信怎么写
2019/06/20 职场文书
详解MySQL 联合查询优化机制
2021/05/10 MySQL