通过字符串导入 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基类函数的重载与调用实例分析
Jan 12 Python
Python简单连接MongoDB数据库的方法
Mar 15 Python
Python内置数据结构与操作符的练习题集锦
Jul 01 Python
Python进阶之尾递归的用法实例
Jan 31 Python
对python打乱数据集中X,y标签对的方法详解
Dec 14 Python
使用python实现抓取腾讯视频所有电影的爬虫
Apr 15 Python
Django框架模板语言实例小结【变量,标签,过滤器,继承,html转义】
May 23 Python
django 中的聚合函数,分组函数,F 查询,Q查询
Jul 25 Python
django中url映射规则和服务端响应顺序的实现
Apr 02 Python
Python Pandas 对列/行进行选择,增加,删除操作
May 17 Python
python如何安装下载后的模块
Jul 03 Python
Python 在局部变量域中执行代码
Aug 07 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
Win2000+Apache+MySql+PHP4+PERL安装使用小结
2006/10/09 PHP
php将字符串全部转换成大写或者小写的方法
2015/03/17 PHP
js的写法基础分析
2011/01/17 Javascript
javascript 基础篇2 数据类型,语句,函数
2012/03/14 Javascript
一个关于javascript匿名函数的问题分析
2012/03/30 Javascript
Javascript 数组排序详解
2014/10/22 Javascript
整理JavaScript创建对象的八种方法
2015/11/03 Javascript
java必学必会之static关键字
2015/12/03 Javascript
nodejs修复ipa处理过的png图片
2016/02/17 NodeJs
轻松掌握JavaScript中介者模式
2016/08/26 Javascript
vue从使用到源码实现教程详解
2016/09/19 Javascript
JavaScript实现瀑布流以及加载效果
2017/02/11 Javascript
详解Next.js页面渲染的优化方案
2019/01/27 Javascript
JavaScript使用prototype属性实现继承操作示例
2020/05/22 Javascript
vue中实现拖动调整左右两侧div的宽度的示例代码
2020/07/22 Javascript
小程序组件传值和引入sass的方法(使用vant Weapp组件库)
2020/11/24 Javascript
[07:38]2014DOTA2国际邀请赛 Newbee顺利挺进胜者组赛后专访
2014/07/15 DOTA
[01:02:55]CHAOS vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
Python3简单实例计算同花的概率代码
2017/12/06 Python
python+matplotlib绘制3D条形图实例代码
2018/01/17 Python
python os模块简单应用示例
2019/05/23 Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
2019/06/03 Python
python正则-re的用法详解
2019/07/28 Python
Python Pandas 如何shuffle(打乱)数据
2019/07/30 Python
django 环境变量配置过程详解
2019/08/06 Python
Python如何将函数值赋给变量
2020/04/28 Python
python脚本使用阿里云slb对恶意攻击进行封堵的实现
2021/02/04 Python
HTML5实现签到 功能
2018/10/09 HTML / CSS
工厂门卫岗位职责
2013/11/25 职场文书
中专生自我鉴定
2013/12/17 职场文书
英文演讲稿
2014/05/15 职场文书
三好生演讲稿
2014/09/12 职场文书
2015年度电厂个人工作总结
2015/05/13 职场文书
社团招新宣传语
2015/07/13 职场文书
入党申请书怎么写?
2019/06/21 职场文书
Three.js实现雪糕地球的使用示例详解
2022/07/07 Javascript