通过字符串导入 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 相关文章推荐
Flask框架学习笔记(一)安装篇(windows安装与centos安装)
Jun 25 Python
python目录与文件名操作例子
Aug 28 Python
python excel使用xlutils类库实现追加写功能的方法
May 02 Python
Django使用详解:ORM 的反向查找(related_name)
May 30 Python
python 多个参数不为空校验方法
Feb 14 Python
Python爬虫使用浏览器cookies:browsercookie过程解析
Oct 22 Python
Django使用消息提示简单的弹出个对话框实例
Nov 15 Python
Python文本处理简单易懂方法解析
Dec 19 Python
浅谈TensorFlow之稀疏张量表示
Jun 30 Python
利用Python中的Xpath实现一个在线汇率转换器
Sep 09 Python
python opencv人脸识别考勤系统的完整源码
Apr 26 Python
python 实现的截屏工具
May 08 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
Smarty结合Ajax实现无刷新留言本实例
2007/01/02 PHP
MySQL相关说明
2007/01/15 PHP
php_screw安装使用教程(另一个PHP代码加密实现)
2014/05/29 PHP
PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
2014/08/18 PHP
php获得客户端浏览器名称及版本的方法(基于ECShop函数)
2015/12/23 PHP
php获取今日开始时间和结束时间的方法
2017/02/27 PHP
php的常量和变量实例详解
2017/06/27 PHP
利用window.name实现windowStorage代码分享
2014/01/02 Javascript
javascript中基本类型和引用类型的区别分析
2015/05/12 Javascript
JavaScript实现鼠标点击导航栏变色特效
2017/02/08 Javascript
纯jQuery实现前端分页功能
2017/03/23 jQuery
详解用node编写自己的cli工具
2017/05/23 Javascript
angular框架实现全选与单选chekbox的自定义
2017/07/06 Javascript
简单实现js放大镜效果
2017/07/24 Javascript
AngularJS ionic手势事件的使用总结
2017/08/09 Javascript
javascript高仿热血传奇游戏实现代码
2018/02/22 Javascript
layui 数据表格复选框实现单选功能的例子
2019/09/19 Javascript
JavaScript接口实现方法实例分析
2020/05/16 Javascript
vue+node 实现视频在线播放的实例代码
2020/10/19 Javascript
[02:28]DOTA2英雄基础教程 狼人
2013/12/23 DOTA
Python中的赋值、浅拷贝、深拷贝介绍
2015/03/09 Python
python数组复制拷贝的实现方法
2015/06/09 Python
python dict.get()和dict['key']的区别详解
2016/06/30 Python
如何用itertools解决无序排列组合的问题
2017/05/18 Python
利用 python 对目录下的文件进行过滤删除
2017/12/27 Python
Python设计模式之门面模式简单示例
2018/01/09 Python
pytorch实现保证每次运行使用的随机数都相同
2020/02/20 Python
Selenium 配置启动项参数的方法
2020/12/04 Python
python-图片流传输的思路及示例(url转换二维码)
2020/12/21 Python
python中remove函数的踩坑记录
2021/01/04 Python
使用Html5多媒体实现微信语音功能
2019/07/26 HTML / CSS
洛杉矶健身中心女性专用运动服饰品牌:Marika
2018/05/09 全球购物
经典公益广告词
2014/03/13 职场文书
2014年预备党员端正入党动机思想汇报
2014/09/13 职场文书
学生会工作感言
2015/08/07 职场文书
了解Redis常见应用场景
2021/06/23 Redis