通过字符串导入 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的Flask框架中使用日期和时间的教程
Apr 21 Python
Python中有趣在__call__函数
Jun 21 Python
全面解析Python的While循环语句的使用方法
Oct 13 Python
Python OpenCV处理图像之图像像素点操作
Jul 10 Python
详解Django-auth-ldap 配置方法
Dec 10 Python
Python判断是否json是否包含一个key的方法
Dec 31 Python
python3 pygame实现接小球游戏
May 14 Python
keras 两种训练模型方式详解fit和fit_generator(节省内存)
Jul 03 Python
Python压缩模块zipfile实现原理及用法解析
Aug 14 Python
用Python自动清理电脑内重复文件,只要10行代码(自动脚本)
Jan 09 Python
完美解决torch.cuda.is_available()一直返回False的玄学方法
Feb 06 Python
Python爬虫基础之爬虫的分类知识总结
May 13 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 header()函数使用说明
2008/07/10 PHP
PHP SEO优化之URL优化方法
2011/04/21 PHP
php常用正则函数实例小结
2016/12/29 PHP
php实现支持中文的文件下载功能示例
2017/08/30 PHP
浅析PHP中的 inet_pton 网络函数
2019/12/16 PHP
解决遍历时Array.indexOf产生的性能问题
2012/07/03 Javascript
jQuery实现带滚动线条导航效果的方法
2015/01/30 Javascript
在JavaScript中使用开平方根的sqrt()方法
2015/06/15 Javascript
新手快速学习JavaScript免费教程资源汇总
2015/06/25 Javascript
深入浅析JavaScript中with语句的理解
2016/05/12 Javascript
jQuery实现图像旋转动画效果
2016/05/29 Javascript
浅谈js数据类型判断与数组判断
2016/08/29 Javascript
JS实现重新加载当前页面
2016/11/29 Javascript
ES6入门教程之let和const命令详解
2017/05/17 Javascript
nodeJS实现简单网页爬虫功能的实例(分享)
2017/06/08 NodeJs
js时间转换毫秒的实例代码
2019/08/21 Javascript
vue element实现表格合并行数据
2020/11/30 Vue.js
[00:14]PWL:老朋友Mushi拍VLOG与中国玩家问好
2020/11/04 DOTA
Java中重定向输出流实现用文件记录程序日志
2015/06/12 Python
python学习笔记之列表(list)与元组(tuple)详解
2017/11/23 Python
python3+PyQt5 数据库编程--增删改实例
2019/06/17 Python
PyQt5创建一个新窗口的实例
2019/06/20 Python
python从list列表中选出一个数和其对应的坐标方法
2019/07/20 Python
Python的互斥锁与信号量详解
2019/09/12 Python
30秒学会30个超实用Python代码片段【收藏版】
2019/10/15 Python
python微信公众号开发简单流程实现
2020/03/09 Python
Python json读写方式和字典相互转化
2020/04/18 Python
使用tensorflow实现VGG网络,训练mnist数据集方式
2020/05/26 Python
利用SVG和CSS3来实现一个炫酷的边框动画
2015/07/22 HTML / CSS
美国在线自行车商店:Jenson USA
2018/05/22 全球购物
德国BA保镖药房中文网:Bodyguard Apotheke
2021/03/09 全球购物
文明倡议书
2015/01/19 职场文书
2015学校图书管理员工作总结
2015/05/11 职场文书
2015年教师见习期工作总结
2015/05/20 职场文书
校园文化艺术节开幕词
2016/03/04 职场文书
go语言-在mac下brew升级golang
2021/04/25 Golang