通过字符串导入 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 相关文章推荐
linux环境下安装pyramid和新建项目的步骤
Nov 27 Python
wxpython 最小化到托盘与欢迎图片的实现方法
Jun 09 Python
python类继承用法实例分析
May 27 Python
python简单实现基于SSL的IRC bot实例
Jun 15 Python
python基础_文件操作实现全文或单行替换的方法
Sep 04 Python
33个Python爬虫项目实战(推荐)
Jul 08 Python
使用django的ORM框架按月统计近一年内的数据方法
Jul 18 Python
pycharm无法导入本地模块的解决方式
Feb 12 Python
Python爬取365好书中小说代码实例
Feb 28 Python
python去除删除数据中\u0000\u0001等unicode字符串的代码
Mar 06 Python
解决jupyter notebook显示不全出现框框或者乱码问题
Apr 09 Python
python小型的音频操作库mp3Play
Apr 24 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
如何开发一个虚拟域名系统
2006/10/09 PHP
PHP 冒泡排序算法的实现代码
2010/08/08 PHP
简介PHP的Yii框架中缓存的一些高级用法
2016/03/29 PHP
PHP图片水印类的封装
2017/07/06 PHP
laravel框架语言包拓展实现方法分析
2019/11/22 PHP
jquery 与NVelocity 产生冲突的解决方法
2011/06/13 Javascript
解决jquery中美元符号命名冲突问题
2014/01/08 Javascript
js之ActiveX控件使用说明 new ActiveXObject()
2014/03/03 Javascript
2014最热门的JavaScript代码高亮插件推荐
2014/11/25 Javascript
HTML,CSS,JavaScript速查表推荐
2014/12/02 Javascript
jQuery控制网页打印指定区域的方法
2015/04/07 Javascript
jQuery实现的分子运动小球碰撞效果
2016/01/27 Javascript
jQuery使用模式窗口实现在主页面和子页面中互相传值的方法
2016/03/01 Javascript
JavaScript操作 url 中 search 部分方法函数
2016/06/15 Javascript
正则中的回溯定义与用法分析【JS与java实现】
2016/12/27 Javascript
利用webstrom调试Vue.js单页面程序的方法教程
2017/06/06 Javascript
Angular.js ng-file-upload结合springMVC的使用教程
2017/07/10 Javascript
使用apifm-wxapi快速开发小程序过程详解
2019/08/05 Javascript
详解将微信小程序接口Promise化并使用async函数
2019/08/05 Javascript
详解Node.JS模块 process
2020/08/31 Javascript
教你如何在Django 1.6中正确使用 Signal
2014/06/22 Python
对Django外键关系的描述
2019/07/26 Python
python如何运行js语句
2020/09/09 Python
全球领先的各类汽车配件零售商:Advance Auto Parts
2016/08/26 全球购物
班级入场式解说词
2014/02/01 职场文书
益达广告词
2014/03/14 职场文书
青春无悔演讲稿
2014/05/08 职场文书
芙蓉镇观后感
2015/06/10 职场文书
2015秋季开学典礼演讲稿
2015/07/16 职场文书
初一数学教学反思
2016/02/17 职场文书
公司趣味运动会开幕词
2016/03/04 职场文书
《弟子规》读后感:知廉耻、明是非、懂荣辱、辨善恶
2019/12/03 职场文书
在HTML5 localStorage中存储对象的示例代码
2021/04/21 Javascript
Vue Element-ui表单校验规则实现
2021/07/09 Vue.js
PostgreSQL自动更新时间戳实例代码
2021/11/27 PostgreSQL
详解JSON.parse和JSON.stringify用法
2022/02/18 Javascript