通过字符串导入 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 相关文章推荐
详解Django框架中用户的登录和退出的实现
Jul 23 Python
浅析Python中的for 循环
Jun 09 Python
深入浅析ImageMagick命令执行漏洞
Oct 11 Python
Python虚拟环境virtualenv的安装与使用详解
May 28 Python
python pandas中DataFrame类型数据操作函数的方法
Apr 08 Python
Python3.5实现的罗马数字转换成整数功能示例
Feb 25 Python
解决python 3 urllib 没有 urlencode 属性的问题
Aug 22 Python
Python笔记之facade模式
Nov 20 Python
Ubuntu18.04安装 PyCharm并使用 Anaconda 管理的Python环境
Apr 08 Python
python实现小程序推送页面收录脚本
Apr 20 Python
Python实现UDP程序通信过程图解
May 15 Python
django models里数据表插入数据id自增操作
Jul 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
2.PHP入门
2006/10/09 PHP
PHP获得数组交集与差集的方法
2015/06/10 PHP
javascript 框架小结 个人工作经验
2009/06/13 Javascript
javascript 浏览器检测代码精简版
2010/03/04 Javascript
javascript中"/"运算符常见错误
2010/10/13 Javascript
基于Jquery制作的幻灯片图集效果打包下载
2011/02/12 Javascript
js正则表达式中test,exec,match方法的区别说明
2014/01/29 Javascript
document.compatMode的CSS1compat使用介绍
2014/04/03 Javascript
IE6-IE9中tbody的innerHTML不能赋值的解决方法
2014/09/26 Javascript
JS实现跟随鼠标的链接文字提示框效果
2015/08/06 Javascript
AngularJs 常用的过滤器
2017/05/15 Javascript
微信网页授权并获取用户信息的方法
2018/07/30 Javascript
Angular 利用路由跳转到指定页面的指定位置方法
2018/08/31 Javascript
Vue项目中使用better-scroll实现一个轮播图自动播放功能
2018/12/03 Javascript
如何在Vue.js中实现标签页组件详解
2019/01/02 Javascript
layui.use模块外部使用其内部定义的js封装函数方法
2019/09/16 Javascript
javascript设计模式 ? 单例模式原理与应用实例分析
2020/04/09 Javascript
Vue如何基于vue-i18n实现多国语言兼容
2020/07/17 Javascript
WebStorm无法正确识别Vue3组合式API的解决方案
2021/02/18 Vue.js
[00:35]DOTA2上海特级锦标赛 MVP.Phx战队宣传片
2016/03/04 DOTA
详解Python Socket网络编程
2016/01/05 Python
python查看微信好友是否删除自己
2016/12/19 Python
浅谈Python中的私有变量
2018/02/28 Python
python list删除元素时要注意的坑点分享
2018/04/18 Python
Python设计模式之原型模式实例详解
2019/01/18 Python
python3射线法判断点是否在多边形内
2019/06/28 Python
50行Python代码获取高考志愿信息的实现方法
2019/07/23 Python
试述DBMS的主要功能
2016/11/13 面试题
传统软件工程与面向对象的软件工程有什么区别
2012/05/31 面试题
水污染治理专业毕业生推荐信
2013/11/14 职场文书
《小小雨点》教学反思
2014/02/18 职场文书
感情真挚的毕业生求职信
2014/07/19 职场文书
整改落实自查报告
2014/11/05 职场文书
2015年统计员个人工作总结
2015/07/23 职场文书
幼儿园小班教育随笔
2015/08/14 职场文书
Python实现随机生成迷宫并自动寻路
2021/06/13 Python