通过字符串导入 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 continue语句用法实例
Mar 11 Python
Python下Fabric的简单部署方法
Jul 14 Python
Python文本特征抽取与向量化算法学习
Dec 22 Python
Python基于win32ui模块创建弹出式菜单示例
May 09 Python
python 字典中文key处理,读取,比较方法
Jul 06 Python
在python中对变量判断是否为None的三种方法总结
Jan 23 Python
利用Python库Scapy解析pcap文件的方法
Jul 23 Python
使用Pytorch来拟合函数方式
Jan 14 Python
深入了解Python enumerate和zip
Jul 16 Python
Pytorch框架实现mnist手写库识别(与tensorflow对比)
Jul 20 Python
详解Anaconda安装tensorflow报错问题解决方法
Nov 01 Python
Ubuntu20.04环境安装tensorflow2的方法步骤
Jan 29 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
改进的IP计数器
2006/10/09 PHP
dede3.1分页文字采集过滤规则详说(图文教程)
2007/04/03 PHP
php 上传文件类型判断函数(避免上传漏洞 )
2010/06/08 PHP
如何判断php数组的维度
2013/06/10 PHP
WordPress中访客登陆实现邮件提醒的PHP脚本实例分享
2015/12/14 PHP
PHP中的多种加密技术及代码示例解析
2016/10/20 PHP
php curl获取到json对象并转成数组array的方法
2018/05/31 PHP
Javascript中的相等与不等运算
2010/04/25 Javascript
添加JavaScript重载函数的辅助方法2
2010/07/04 Javascript
jquery点击页面任何区域实现鼠标焦点十字效果
2013/06/21 Javascript
轻量级javascript 框架Backbone使用指南
2015/07/24 Javascript
实例解析JS布尔对象的toString()方法和valueOf()方法
2015/10/25 Javascript
基于Echarts 3.19 制作常用的图形(非静态)
2016/05/19 Javascript
vue.js入门(3)——详解组件通信
2016/12/02 Javascript
Vue.js学习之过滤器详解
2017/01/22 Javascript
Angular2 组件通信的实例代码
2017/06/23 Javascript
详解webpack多页面配置记录
2018/01/22 Javascript
简述JS浏览器的三种弹窗
2018/07/15 Javascript
vue组件实践之可搜索下拉框功能
2018/11/25 Javascript
微信小程序实现的3d轮播图效果示例【基于swiper组件】
2018/12/11 Javascript
详解Vue的组件中data选项为什么必须是函数
2020/08/17 Javascript
[05:28]刀塔密之一:团结则存
2014/07/03 DOTA
Python机器学习之决策树算法实例详解
2017/12/06 Python
Python定义一个跨越多行的字符串的多种方法小结
2018/07/19 Python
python项目对接钉钉SDK的实现
2019/07/15 Python
解决python中的幂函数、指数函数问题
2019/11/25 Python
CSS3制作圆形滚动进度条动画的示例
2020/11/05 HTML / CSS
HTML5新增的8类INPUT输入类型介绍
2015/07/06 HTML / CSS
大学生毕业求职的自我评价
2013/09/29 职场文书
学生会主席事迹材料
2014/01/28 职场文书
小学毕业感言50字
2014/02/16 职场文书
2014乡镇“三八”国际劳动妇女节活动总结
2014/03/01 职场文书
太太口服液广告词
2014/03/20 职场文书
2014年新生军训方案
2014/05/01 职场文书
情况说明书格式范文
2014/05/06 职场文书
CentOS7和8下安装Maven3.8.4
2022/04/07 Servers