通过字符串导入 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 pickle 和 shelve模块的用法
Sep 16 Python
从零学python系列之教你如何根据图片生成字符画
May 23 Python
Python中的defaultdict模块和namedtuple模块的简单入门指南
Apr 01 Python
Python编程实现的图片识别功能示例
Aug 03 Python
python如何重载模块实例解析
Jan 25 Python
Django教程笔记之中间件middleware详解
Aug 01 Python
python实现dijkstra最短路由算法
Jan 17 Python
Python Pandas实现数据分组求平均值并填充nan的示例
Jul 04 Python
详解从Django Allauth中进行登录改造小结
Dec 18 Python
Python接口自动化测试的实现
Aug 28 Python
Python使用pyenv实现多环境管理
Feb 05 Python
pandas中pd.groupby()的用法详解
Jun 16 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
基于asp+ajax和数据库驱动的二级联动菜单
2010/05/06 PHP
163的邮件用phpmailer发送(实例详解)
2013/06/24 PHP
PHP Oauth授权和本地加密实现方法
2016/08/12 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
php实现等比例压缩图片
2018/07/26 PHP
Node.js 的异步 IO 性能探讨
2014/10/08 Javascript
nodejs调用cmd命令实现复制目录
2015/05/04 NodeJs
jquery中实现时间戳与日期相互转换
2016/04/12 Javascript
AngularJS 获取ng-repeat动态生成的ng-model值实例详解
2016/11/29 Javascript
微信页面倒计时代码(解决safari不兼容date的问题)
2016/12/13 Javascript
温故知新——JavaScript中的字符串连接问题最全总结(推荐)
2017/08/21 Javascript
JavaScript如何获取到导航条中HTTP信息
2017/10/10 Javascript
使用veloticy-ui生成文字动画效果
2018/02/08 Javascript
详解如何在你的Vue项目配置vux
2018/06/04 Javascript
浅谈ng-zorro使用心得
2018/12/03 Javascript
学习LayUI时自研的表单参数校验框架案例分析
2019/07/29 Javascript
layui插件表单验证提交触发提交的例子
2019/09/09 Javascript
echarts实现获取datazoom的起始值(包括x轴和y轴)
2020/07/20 Javascript
Nuxt.js的路由跳转操作(页面跳转nuxt-link)
2020/11/06 Javascript
跟老齐学Python之print详解
2014/09/28 Python
python学习教程之使用py2exe打包
2017/09/24 Python
Python 统计字数的思路详解
2018/05/08 Python
Python装饰器的执行过程实例分析
2018/06/04 Python
Python实现的字典排序操作示例【按键名key与键值value排序】
2018/12/21 Python
python3+selenium实现126邮箱登陆并发送邮件功能
2019/01/23 Python
python实现视频分帧效果
2019/05/31 Python
django写用户登录判定并跳转制定页面的实例
2019/08/21 Python
python 实现生成均匀分布的点
2019/12/05 Python
python 实现客户端与服务端的通信
2020/12/23 Python
写好自荐信的要点
2013/11/06 职场文书
行政人事经理职位说明书
2014/03/05 职场文书
三年级小学生评语
2014/04/22 职场文书
三方股东合作协议书范本
2014/09/28 职场文书
2014年服务员个人工作总结
2014/12/23 职场文书
小学教师岗位职责
2015/04/02 职场文书
gojs实现蚂蚁线动画效果
2022/02/18 Javascript