python利用自动识别写模块_教你用Python 实现自动导入缺失的库

在写 Python 项目的时候,我们可能经常会遇到导入模块失败的错误:ImportError: No module named ‘xxx’ 或者 ModuleNotFoundError: No module named ‘xxx’ 。

导入失败问题,通常分为两种:一种是导入自己写的模块(即以 .py 为后缀的文件),另一种是导入三方库。本文主要讨论第二种情况,今后有机会,我们再详细讨论其它的相关话题。

解决导入 Python 库失败的问题,其实关键是在运行环境中装上缺失的库(注意是否是虚拟环境),或者使用恰当的替代方案。这个问题又分为三种情况:

一、单个模块中缺失的库

在编写代码的时候,如果我们需要使用某个三方库(如 requests),但不确定实际运行的环境是否装了它,那么可以这样写:

这样写的效果是,如果找不到 requests 库,就先安装,再导入。

在某些开源项目中,我们可能还会看到如下的写法(以 json 为例):

这样写的效果是,优先导入三方库 simplejson,如果找不到,那就使用内置的标准库 json。

这种写法的好处是不需要导入额外的库,但它有个缺点,即需要保证那两个库在使用上是兼容的,如果在标准库中找不到替代的库,那就不可行了。

如果真找不到兼容的标准库,也可以自己写一个模块(如 my_json.py),实现想要的东西,然后在 except 语句中再导入它。

二、整个项目中缺失的库

以上的思路是针对开发中的项目,但是它有几个不足:1、在代码中对每个可能缺失的三方库都 pip install,并不可取;2、某个三方库无法被标准库或自己手写的库替代,该怎么办?3、已成型的项目,不允许做这些修改怎么办?

所以这里的问题是:有一个项目,想要部署到新的机器上,它涉及很多三方库,但是机器上都没有预装,该怎么办?

对于一个合规的项目,按照约定,通常它会包含一个“requirements.txt ”文件,记录了该项目的所有依赖库及其所需的版本号。这是在项目发布前,使用命令pip freeze > requirements.txt 生成的。

使用命令pip install -r requirements.txt (在该文件所在目录执行,或在命令中写全文件的路径),就能自动把所有的依赖库给装上。

但是,如果项目不合规,或者由于其它倒霉的原因,我们没有这样的文件,又该如何是好?

一个笨方法就是,把项目跑起来,等它出错,遇到一个导库失败,就手动装一个,然后再跑一遍项目,遇到导库失败就装一下,如此循环……(此处省略 1 万句脏话)……

三、自动导入任意缺失的库

有没有一种更好的可以自动导入缺失的库的方法呢?

在不修改原有的代码的情况下,在不需要“requirements.txt”文件的情况下,有没有办法自动导入所需要的库呢?

当然有!先看看效果:

我们以 tornado 为例,第一步操作可看出,我们没有装过 tornado,经过第二步操作后,再次导入 tornado 时,程序会帮我们自动下载并安装好 tornado,所以不再报错。

autoinstall 是我们手写的模块,代码如下:

这段代码中使用了sys.meta_path ,我们先打印一下,看看它是个什么东西?

Python 3 的 import 机制在查找过程中,大致顺序如下:

在 sys.modules 中查找,它缓存了所有已导入的模块

在 sys.meta_path 中查找,它支持自定义的加载器

在 sys.path 中查找,它记录了一些库所在的目录名

若未找到,则抛出 ImportError 异常

其中要注意,sys.meta_path 在不同的 Python 版本中有所差异,比如它在 Python 2 与 Python 3 中差异很大;在较新的 Python 3 版本(3.4+)中,自定义的加载器需要实现find_spec 方法,而早期的版本用的则是find_module 。

以上代码是一个自定义的类库加载器 AutoInstall,可以实现自动导入三方库的目的。需要说明一下,这种方法会“劫持”所有新导入的库,破坏原有的导入方式,因此也可能出现一些奇奇怪怪的问题,敬请留意。

sys.meta_path 属于 Python 探针的一种运用。探针,即import hook,是 Python 几乎不受人关注的机制,但它可以做很多事,例如加载网络上的库、在导入模块时对模块进行修改、自动安装缺失库、上传审计信息、延迟加载等等。

限于篇幅,我们不再详细展开了。最后小结一下:

可以用 try…except 方式,实现简单的三方库导入或者替换

已知全部缺失的依赖库时(如 requirements.txt),可以手动安装

利用 sys.meta_path,可以自动导入任意的缺失库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/489404.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于类的命令行notebook的实现

在看一本书《PYTHON3 面向对象编程》 内容丰富,作作记录。 notebook.py __author__ chengang882import datetime# Store the next available id for all new note last_id 0class Note(object):"""Represent a note in the notebook. Match agains…

python中用socket检测端口_python基于socket函数实现端口扫描

本文实例为大家分享了python基于socket实现端口扫描的具体代码,供大家参考,具体内容如下自学Python一段时间,写个端口扫描器练练手。有什么不足之处,请见谅这是基于socket函数对端口进行端口扫描所以,首先要导入socket…

php清理html table样式,Parse HTML Table - PHP [closed]

问题Closed. This question does not meet Stack Overflow guidelines. It is not currently accepting answers.Want to improve this question? Update the question so its on-topic for Stack Overflow.Closed 6 years ago.I have an HTML table that I would like to par…

2020年五大云计算预测

来源:信息安全与通信保密杂志社Forrester的新报告发现,超大规模云联盟、云原生创新和新的云安全要求将在2020年重塑云计算行业格局。Forrester近日发布了一份报告,对2020年的云计算行业发布了五大预测。这些预测表明争夺云计算霸主地位的竞争…

ResourceManager里面Trackingui需要手动该ip

C:\Windows\System32\drivers\etc这个路径下配置了ip和主机名,不过是大小写,ping不同,不论ping大小写还是全部小写都不行,我看地址栏是小写所以想着把hosts里CentOSMaster改成centosmaster,然后还是不行,备…

qt中的mysql能存入多少行数据_Qt中提高sqlite的读写速度(使用事务一次性写入100万条数据)...

SQLite数据库本质上来讲就是一个磁盘上的文件,所以一切的数据库操作其实都会转化为对文件的操作,而频繁的文件操作将会是一个很好时的过程,会极大地影响数据库存取的速度。例如:向数据库中插入100万条数据,在默认的情况…

计算机英语一级考试试题,全国计算机一级考试试题及答案

单选题1.( )是指连入网络的不同档次、不同型号的微机,它是网络中实际为用户操作的工作平台,它通过插在微机上的网卡和连接电缆与网络服务器相连。 答案:A 难:2A、网络工作站 B、网络服务器 C、传输介质 D、网络操作系统2.通过Internet发送或接收电子邮件…

薛建儒:无人车的场景理解与自主运动

来源:人工智能前沿讲习一报告导读本文为西安交通大学人工智能与机器人研究所薛建儒教授,做的题为无人车场景计算与自主运动的研究进展的报告,主要从无人车概述、场景理解、自主运动、总结与展望四个方面介绍了其团队在无人驾驶领域的探索。在…

(转)HTTP 长连接和短连接

1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠的传递数据包&#xff…

ddr4服务器内存频率_金士顿DDR4-3200服务器内存通过完整测试

全面支持第二代AMD EPYC处理器2019年8月13日北京讯,全球存储领袖金士顿今天宣布旗下Server Premier系列DDR4-3200 Registered DIMMs内存将支持第二代AMD EPYC™服务器处理器。最新款金士顿Server Premier内存频率高达3200MT/s,提供8GB、16GB和32GB三种容…

html 链接section,HTML section 标签

HTML 标签是HTML5新增的语义化标签之一。关于语义化标签的概念与作用可以参阅HTML 语义化布局概述一章节。**一.标签作用:**此标签的功能与标签比较类似,两者联系与区别简单总结如下:(1).可以认为是特殊。(2).更加强调独立性,语义…

中美科技成果转化比较分析

来源:创新研究近年来随着国家在不断加大科技投入,以及专利成果数量的快速增长,全社会对科技创新关注程度不断提高,对我国科技成果转化率低的批评不断增加,有文章指出“我国科技成果的转化率仅有10%,比美国8…

bh1750采集流程图_重大更新:STM32空气监测仪,OneNET物联网平台实时查看(原理图、PCB源文件、程序源码等)...

更新内容:一、SD卡记录功能。自动识别有无SD卡,支持4G以下SD卡。下图为SD卡记录的数据。以日期为文件名自动创建文件。记录格式为:时间,PM1.0,PM2.5,PM10,温度,湿度,大气…

商用计算机低温工作,突破量子计算机瓶颈!超低温芯片能在接近绝对零度的温度下工作...

如何克服量子计算机运转时产生的超高热量仍是量子计算机研究当中的一大难题。日前,科学家开发出一种新型的低温计算机芯片,能够在接近绝对零度的理论温度极限下工作。这种名为 Gooseberry 的低温系统为量子计算领域的革命奠定了基础——使新一代机器能够…

python自动化测试开发_基于python的selenium2自动化测试从基础到实战(Python3、selenium2、自动化测试、web测试)...

Selenium2是目前比较流行的一款针对web页面测试的自动化测试工具,他的前身是Selenium 。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE、Mozilla Firefox、Mozilla Suite等。但是目前使用Selenium2做测试的基本是采用ja…

虚拟机安装CentOS6.4

1 概述 虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统,运行在主机上,完全独立,虚拟机里面的所有操作不会影响主机,即使虚拟机崩溃了&#x…

中国人工智能产业白皮书

来源:北京物联网智能技术应用协会未来智能实验室是人工智能学家与科学院相关机构联合成立的人工智能,互联网和脑科学交叉研究机构。未来智能实验室的主要工作包括:建立AI智能系统智商评测体系,开展世界人工智能智商评测&#xff1…

api laravel 统一返回方法_Laravel API 错误处理:当异常时,如何返回消息

image基于 API 的项目开发越来越受欢迎,并且使用 Laravel 就能很容易实现。但是在针对如何处理各种异常的话题很少被提及。所以 API 的使用者们经常会抱怨除了收到 Server error ,很少有更多的错误信息。那么,我们该如何优雅的处理 API 错误让…

计算机电力英语翻译,电力专业英语阅读与翻译..doc

电力专业英语阅读与翻译.电力专业英语阅读与翻译Summary of glossary 术语电力系统 (electric) power systempower generation 发电transmission system(network) 输电系统(网络)distribution system 配电系统发电 power generationpower plant 发电厂powerhouse 发电站hydropo…