通过字符串导入 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之做一个小游戏
Sep 28 Python
设计模式中的原型模式在Python程序中的应用示例
Mar 02 Python
Django重装mysql后启动报错:No module named ‘MySQLdb’的解决方法
Apr 22 Python
在PyCharm环境中使用Jupyter Notebook的两种方法总结
May 24 Python
Python将视频或者动态图gif逐帧保存为图片的方法
Sep 10 Python
python如何基于redis实现ip代理池
Jan 17 Python
解决Python pip 自动更新升级失败的问题
Feb 21 Python
python实现读取类别频数数据画水平条形图案例
Apr 24 Python
Python爬虫工具requests-html使用解析
Apr 29 Python
python中if及if-else如何使用
Jun 02 Python
Django Form设置文本框为readonly操作
Jul 03 Python
详解基于python的图像Gabor变换及特征提取
Oct 26 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
PHP下通过exec获得计算机的唯一标识[CPU,网卡 MAC地址]
2011/06/09 PHP
根据ip调用新浪api获取城市名并转成拼音
2014/03/07 PHP
Laravel 5框架学习之环境与配置
2015/04/08 PHP
safari下载文件自动加了html后缀问题
2018/11/09 PHP
PHP中的自动加载操作实现方法详解
2019/08/06 PHP
纯JAVASCRIPT图表动画插件Highcharts Examples
2011/04/16 Javascript
javascript 原型继承介绍
2011/08/30 Javascript
js获取IP地址的方法小结
2014/07/01 Javascript
JS逆序遍历实现代码
2014/12/02 Javascript
如何在Linux上安装Node.js
2016/04/01 Javascript
JS基于正则表达式的替换操作(replace)用法示例
2017/04/28 Javascript
解析vue中的$mount
2017/12/21 Javascript
Vue2.0子同级组件之间数据交互方法
2018/02/28 Javascript
bootstrap 路径导航 分页 进度条的实例代码
2018/08/06 Javascript
微信小程序实现展示评分结果功能
2019/02/15 Javascript
layui将table转化表单显示的方法(即table.render转为表单展示)
2019/09/24 Javascript
解决vue初始化项目时,一直卡在Project description上的问题
2019/10/31 Javascript
nodejs制作小爬虫功能示例
2020/02/24 NodeJs
京东优选小程序的实现代码示例
2020/02/25 Javascript
vue使用svg文件补充-svg放大缩小操作(使用d3.js)
2020/09/22 Javascript
详解uniapp的全局变量实现方式
2021/01/11 Javascript
Angular处理未可知异常错误的方法详解
2021/01/17 Javascript
微信小程序canvas实现签名功能
2021/01/19 Javascript
python实现提取str字符串/json中多级目录下的某个值
2020/02/27 Python
AmazeUI 等分网格的实现示例
2020/08/25 HTML / CSS
以下为Windows NT 下的32 位C++程序,请计算sizeof 的值
2016/12/07 面试题
员工自我鉴定范文
2013/10/06 职场文书
前处理组长岗位职责
2014/03/01 职场文书
学生检讨书怎么写?
2014/10/10 职场文书
教师师德表现自我评价
2015/03/05 职场文书
大国崛起英国观后感
2015/06/02 职场文书
春节随笔
2015/08/15 职场文书
网络研修随笔感言
2015/11/18 职场文书
java调用Restful接口的三种方法
2021/08/23 Java/Android
Python实现制作销售数据可视化看板详解
2021/11/27 Python
什么是css原子化,有什么用?
2022/04/24 HTML / CSS