通过字符串导入 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中使用判断语句和循环的教程
Apr 25 Python
python实现爬虫下载美女图片
Jul 14 Python
在DigitalOcean的服务器上部署flaskblog应用
Dec 19 Python
使用Pyinstaller的最新踩坑实战记录
Nov 08 Python
cmd运行python文件时对结果进行保存的方法
May 16 Python
在pycharm 中添加运行参数的操作方法
Jan 19 Python
对Python 多线程统计所有csv文件的行数方法详解
Feb 12 Python
python 爬取学信网登录页面的例子
Aug 13 Python
python词云库wordCloud使用方法详解(解决中文乱码)
Feb 17 Python
使用opencv识别图像红色区域,并输出红色区域中心点坐标
Jun 02 Python
python 基于opencv 绘制图像轮廓
Dec 11 Python
详解Python中的GIL(全局解释器锁)详解及解决GIL的几种方案
Jan 29 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
phpize的深入理解
2013/06/03 PHP
php求两个目录的相对路径示例(php获取相对路径)
2014/03/27 PHP
php实现的ping端口函数实例
2014/11/12 PHP
php实现图片添加描边字和马赛克的方法
2014/12/10 PHP
php获取访问者IP地址汇总
2015/04/24 PHP
Yii2中SqlDataProvider用法示例
2016/09/22 PHP
js类中获取外部函数名的方法
2007/08/19 Javascript
window.print打印指定div指定网页指定区域的方法
2014/08/04 Javascript
JavaScript实现强制重定向至HTTPS页面
2015/06/10 Javascript
移动端翻页插件dropload.js(支持Zepto和jQuery)
2016/07/27 Javascript
js实现日历的简单算法
2017/01/24 Javascript
微信小程序如何获取openid及用户信息
2018/01/26 Javascript
Less 安装及基本用法
2018/05/05 Javascript
seajs下require书写约定实例分析
2018/05/16 Javascript
vue使用v-for实现hover点击效果
2018/09/29 Javascript
JavaScript检测浏览器是否支持CSS变量代码实例
2020/04/03 Javascript
jQuery 添加元素和删除元素的方法
2020/07/15 jQuery
js调用网络摄像头的方法
2020/12/05 Javascript
[04:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster 选手采访
2021/03/11 DOTA
Python实现类似jQuery使用中的链式调用的示例
2016/06/16 Python
python中利用await关键字如何等待Future对象完成详解
2017/09/07 Python
python实现在IDLE中输入多行的方法
2018/04/19 Python
Python3 单行多行万能正则匹配方法
2019/01/07 Python
Python中的字符串切片(截取字符串)的详解
2019/05/15 Python
python3.7 sys模块的具体使用
2019/07/22 Python
使用selenium和pyquery爬取京东商品列表过程解析
2019/08/15 Python
Python爬虫实现百度翻译功能过程详解
2020/05/29 Python
用python写爬虫简单吗
2020/07/28 Python
Python 高效编程技巧分享
2020/09/10 Python
阿里旅行:飞猪
2017/01/05 全球购物
大学班级学风建设方案
2014/05/01 职场文书
单位法人授权委托书范本
2014/10/09 职场文书
幼儿园托班开学寄语(2015秋季)
2015/05/27 职场文书
后天观后感
2015/06/08 职场文书
mysql timestamp比较查询遇到的坑及解决
2021/11/27 MySQL
Mysql开启外网访问
2022/05/15 MySQL