通过字符串导入 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列表操作使用示例分享
Feb 21 Python
决策树的python实现方法
Nov 18 Python
Django小白教程之Django用户注册与登录
Apr 22 Python
Python 通配符删除文件的实例
Apr 24 Python
Python面向对象之类的封装操作示例
Jun 08 Python
详解Python 定时框架 Apscheduler原理及安装过程
Jun 14 Python
python and or用法详解
Jun 26 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
Dec 10 Python
深入了解NumPy 高级索引
Jul 24 Python
python tkinter实现定时关机
Apr 21 Python
Python图像处理之图像拼接
Apr 28 Python
Python 中 Shutil 模块详情
Nov 11 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
用sql命令修改数据表中的一个字段为非空(not null)的语句
2010/06/04 PHP
PHP实现抓取Google IP并自动修改hosts文件
2015/02/12 PHP
来自国外的14个图片放大编辑的jQuery插件整理
2010/10/20 Javascript
js中访问html中iframe的文档对象的代码[IE6,IE7,IE8,FF]
2011/01/08 Javascript
javascript学习(一)构建自己的JS库
2013/01/02 Javascript
一行代码实现纯数据json对象的深度克隆实现思路
2013/01/09 Javascript
JavaScript中Number.NEGATIVE_INFINITY值的使用详解
2015/06/05 Javascript
jquery.mousewheel实现整屏翻屏效果
2015/08/30 Javascript
JS+CSS实现的经典圆角下拉菜单效果代码
2015/10/21 Javascript
js实现点击获取验证码倒计时效果
2021/01/28 Javascript
全面解析Bootstrap表单使用方法(表单样式)
2015/11/24 Javascript
Bootstrap每天必学之弹出框(Popover)插件
2016/04/25 Javascript
javascript 数组的定义和数组的长度
2016/06/07 Javascript
如何在JS中实现相互转换XML和JSON
2016/07/19 Javascript
jQuery Validate验证框架详解(推荐)
2016/12/17 Javascript
基于JavaScript实现全选、不选和反选效果
2017/02/15 Javascript
详解JS中的立即执行函数
2017/02/24 Javascript
vue路由--网站导航功能详解
2019/03/29 Javascript
JavaScript进阶(四)原型与原型链用法实例分析
2020/05/09 Javascript
Node.js API详解之 zlib模块用法分析
2020/05/19 Javascript
[02:07]2017国际邀请赛中国区预选赛直邀战队前瞻
2017/06/23 DOTA
在Django中使用Sitemap的方法讲解
2015/07/22 Python
Python设计模式编程中Adapter适配器模式的使用实例
2016/03/02 Python
Python selenium 父子、兄弟、相邻节点定位方式详解
2016/09/15 Python
pandas 使用apply同时处理两列数据的方法
2018/04/20 Python
Python正则表达式实现简易计算器功能示例
2019/05/07 Python
安装好Pycharm后如何配置Python解释器简易教程
2019/06/28 Python
flask应用部署到服务器的方法
2019/07/12 Python
CSS3+js实现简单的时钟特效
2015/03/18 HTML / CSS
纯CSS3实现扇形动画菜单(简化版)实例源码
2017/01/17 HTML / CSS
如何清空Session
2015/02/23 面试题
会计出纳员的自我评价
2014/01/15 职场文书
评职称个人总结
2015/03/05 职场文书
2015年上半年计生工作总结
2015/03/30 职场文书
学生会任命书范本
2015/09/21 职场文书
浅谈JS和Nodejs中的事件驱动
2021/05/05 NodeJs