通过字符串导入 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实现K最近邻算法
Jan 29 Python
对numpy中布尔型数组的处理方法详解
Apr 17 Python
深入理解Django-Signals信号量
Feb 19 Python
python SVM 线性分类模型的实现
Jul 19 Python
用Python实现二叉树、二叉树非递归遍历及绘制的例子
Aug 09 Python
python ftplib模块使用代码实例
Dec 31 Python
关于Keras模型可视化教程及关键问题的解决
Jan 24 Python
Python sql注入 过滤字符串的非法字符实例
Apr 03 Python
Python爬虫之爬取淘女郎照片示例详解
Jul 28 Python
python中not、and和or的优先级与详细用法介绍
Nov 03 Python
详解python3类型注释annotations实用案例
Jan 20 Python
基于Python-turtle库绘制路飞的草帽骷髅旗、美国队长的盾牌、高达的源码
Feb 18 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
超神学院:鹤熙已踏入神圣领域,实力不比凯莎弱
2020/03/02 国漫
PHP之APC缓存详细介绍 apc模块安装
2014/01/13 PHP
windows server 2008/2012安装php iis7 mysql环境搭建教程
2016/06/30 PHP
用JQuery 实现AJAX加载XML并解析的脚本
2009/07/25 Javascript
jquery 模拟类搜索框自动完成搜索提示功能(改进)
2010/05/24 Javascript
node+express+ejs制作简单页面上手指南
2014/11/26 Javascript
js实现简单的左右两边固定广告效果实例
2015/04/10 Javascript
jquery实现不包含当前项的选择器实例
2015/06/25 Javascript
jQuery前端开发35个小技巧
2016/05/24 Javascript
Vue.js教程之计算属性
2016/11/11 Javascript
JS实现简单的天数计算器完整实例
2017/04/28 Javascript
js实现前端图片上传即时预览功能
2017/08/02 Javascript
React/Redux应用使用Async/Await的方法
2017/11/16 Javascript
js实现直播点击飘心效果
2020/08/19 Javascript
微信小程序学习之自定义滚动弹窗
2020/12/20 Javascript
一百行python代码将图片转成字符画
2021/02/19 Python
详解Python 函数如何重载?
2019/04/23 Python
Python表达式的优先级详解
2020/02/18 Python
python GUI库图形界面开发之PyQt5时间控件QTimer详细使用方法与实例
2020/02/26 Python
浅谈django框架集成swagger以及自定义参数问题
2020/07/07 Python
在 Windows 下搭建高效的 django 开发环境的详细教程
2020/07/27 Python
Python如何定义有可选参数的元类
2020/07/31 Python
灵活运用CSS3特性绘制简易版围棋效果
2016/09/28 HTML / CSS
建筑结构施工求职信
2014/07/11 职场文书
商务英语专业大学生职业生涯规划书
2014/09/14 职场文书
见习报告的格式
2014/11/04 职场文书
破坏寝室公物检讨书
2014/11/17 职场文书
2014年禁毒工作总结
2014/11/24 职场文书
2014年村党支部工作总结
2014/12/04 职场文书
幼儿园感恩节活动总结
2015/03/24 职场文书
导游词之宿迁乾隆行宫
2019/10/15 职场文书
Mysql实现简易版搜索引擎的示例代码
2021/08/30 MySQL
HTML5 新增内容和 API详解
2021/11/17 HTML / CSS
Python的三个重要函数详解
2022/01/18 Python
vue实现拖拽交换位置
2022/04/07 Vue.js
MongoDB支持的数据类型
2022/04/11 MongoDB