电子发烧友网 > 嵌入式技术 > 编程语言及工具 > 正文

导入Python库失败的缺失库怎么解决

2020年11月21日 11:46 次阅读

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

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

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

一、单个模块中缺失的库

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

try:importrequestsexcepTImportError:importosos.system('pipinstallrequests')importrequests

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

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

try:importsimplejsonasjsonexcepTImportError:importjson

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

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

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

try:importsimplejsonasjsonexcepTImportError:importmy_jsonasjson

二、整个项目中缺失的库

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

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

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

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

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

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

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

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

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

当然有!先看看效果:


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

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

#以下代码在python3.6.1版本验证通过importsysimportosfromimportlibimporTImport_moduleclassAutoInstall():_loaded=set()@classmethoddeffind_spec(cls,name,path,target=None):ifpathisNoneandnamenotincls._loaded:cls._loaded.add(name)print("Installing",name)try:result=os.system('pipinstall{}'.format(name))ifresult==0:returnimport_module(name)exceptExceptionase:print("Failed",e)returnNonesys.meta_path.append(AutoInstall)

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


Python3的import机制在查找过程中,大致顺序如下:
•在sys.modules中查找,它缓存了所有已导入的模块
•在sys.meta_path中查找,它支持自定义的加载器
•在sys.path中查找,它记录了一些库所在的目录名
•若未找到,抛出ImportError异常

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


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

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

限于篇幅,我们不再详细展开了。

最后小结一下:
•可以用try…except方式,实现简单的三方库导入或者替换
•已知全部缺失的依赖库时(如requirements.txt),可以手动安装
•利用sys.meta_path,可以自动导入任意的缺失库

参考资料:
https://github.com/liuchang0812/slides/tree/master/pycon2015cn
http://blog.konghy.cn/2016/10/25/python-import-hook
https://docs.python.org/3/library/sys.html#sys.meta_path

编辑:hfy


下载发烧友APP

打造属于您的人脉电子圈

关注电子发烧友微信

有趣有料的资讯及技术干货

关注发烧友课堂

锁定最新课程活动及技术直播

电子发烧友观察

一线报道 · 深度观察 · 最新资讯
收藏 人收藏
分享:

评论

相关推荐

零基础Python入门教程二

随着新技术的不断推进,在未来无论你要进入网页开发、数据分析、机器学习、人工智能还是无人车等领域,Python 都是必不可
发烧友学院发表于 2019-04-09 00:00 0次阅读
零基础Python入门教程二

C#良好兼容了值类型/引用类型

反观历史,C#也曾经因为 值类型/引用类型 保守诟病,“拆箱”和“装箱”一直是个招黑的设计。但后来我....
发表于 2020-11-20 10:14 65次阅读
C#良好兼容了值类型/引用类型

Python逐渐失去魅力

自从20世纪90年代初发布以来,Python一直相当火爆,在这二十多年里,它的流行程度远远超过了C、....
发表于 2020-11-19 11:05 147次阅读
Python逐渐失去魅力

Python20年来首次超越Java

根据 2020 年 11 月最新出炉的 TIOBE 编程语言排行榜,Python 以 12.12% ....
发表于 2020-11-16 11:28 267次阅读
Python20年来首次超越Java

请问python文件怎么操作?

python文件的操作步骤
发表于 2020-11-16 07:53 0次阅读
请问python文件怎么操作?

【编测编学】零基础学python_04_字符串(删除空白)分析

删除字符串中的空白: 在程序中,额外的空白可能令人迷惑。对程序员来说,'python' 和'python ' 看起来几乎没什么...
发表于 2020-11-14 11:24 404次阅读
【编测编学】零基础学python_04_字符串(删除空白)分析

出现ImportError: No module named PyQt4.QtGui的解决方法

将python3.7版本环境(图中前两个)上移到最上层,用户变量和系统变量都要调。...
发表于 2020-11-14 00:03 101次阅读
出现ImportError: No module named PyQt4.QtGui的解决方法

Python 之父正式加入微软

11月13日消息 去年 10 月, Python 创始人 Guido van Rossum 在 Dr....
发表于 2020-11-13 17:39 315次阅读
Python 之父正式加入微软

【MaaXBoard开发板试用体验】十运行python程序建立web网站

一直想在kindle电子书屏幕上作为树莓派或者maaxboard开发板的显示器,刷新速度虽然慢,但是编程调试够用。 之前了解...
发表于 2020-11-13 15:09 202次阅读
【MaaXBoard开发板试用体验】十运行python程序建立web网站

Python 创始人复出 宣布已加入微软开发者部...

去年 10 月, Python 创始人 Guido van Rossum 在 Dropbox 公司工....
发表于 2020-11-13 11:41 250次阅读
Python 创始人复出 宣布已加入微软开发者部...

人工智能行业,编程学习是Python还是C++好...

很多想要进入人工智能行业的开发者都会纠结于学习Python还是学习C++。有些人认为,Python目....
发表于 2020-11-13 09:29 279次阅读
人工智能行业,编程学习是Python还是C++好...

零基础学python_03_字符串(拼接+换行+制表符)

字符串拼接 在编码的过程很多时候都会用到字符串的拼接,例如,你可能想将姓和名存储在不同的变量中,等要显示姓名时...
发表于 2020-11-11 15:30 303次阅读
零基础学python_03_字符串(拼接+换行+制表符)

不再低调,QuecPython横空出世

移远通信正式推出一套轻松上手、功能完善的嵌入式操作系统——QuecPython,可让客户基于移远模组....
发表于 2020-11-11 11:49 515次阅读
不再低调,QuecPython横空出世

如何用Python给头像添加国旗?

用Python给头像添加国旗的方法
发表于 2020-11-11 08:02 0次阅读
如何用Python给头像添加国旗?

求python小案例demo01?

python小案例demo01
发表于 2020-11-10 07:18 0次阅读
求python小案例demo01?

Python仍是人工智能和机器学习的主导编程语言...

上世纪90年代初,Python面世了。近30年来,关于它的“炒作”一直没有少过。当然,编程界花了至少....
发表于 2020-11-09 14:30 451次阅读
Python仍是人工智能和机器学习的主导编程语言...

请问Python中的类方法、实例方法和静态方法是什么?

Python中的类方法、实例方法和静态方法
发表于 2020-11-09 07:13 0次阅读
请问Python中的类方法、实例方法和静态方法是什么?

最新的编程语言排行说明Python冲上第二

本月的排行榜出现了自 TIOBE 榜单发布以来,近二十年从未见过的变化:前两名的位置首次出现了一个除....
发表于 2020-11-07 10:54 383次阅读
最新的编程语言排行说明Python冲上第二

怎样使用Python创建词云

介绍从开始从事数据可视化工作的那一天起,我就爱上它了,我总是喜欢从数据中获得有用的见解。在此之前,我....
发表于 2020-11-06 17:26 296次阅读
怎样使用Python创建词云

高焕堂老师《AI概论:来来来,成为AI的良师益友》(全文)

这是一本非常基础的 AI 入门书籍。AI 的与会比传统IT(信息)有趣的地方是,当今 AI 的基础是:机器学习(Machi...
发表于 2020-11-06 17:25 909次阅读
高焕堂老师《AI概论:来来来,成为AI的良师益友》(全文)

请问Python中如何实现vlookup函数的功能?

vlookup函数功能非常强大,那在Python中如何实现?...
发表于 2020-11-06 06:11 0次阅读
请问Python中如何实现vlookup函数的功能?

Python3.9的新特性必知图

Python3.9,「千呼万唤始出来」。 先来速看下此次发布版本的重点。 新语法特性: PEP 58....
发表于 2020-11-05 15:33 332次阅读
Python3.9的新特性必知图

Python 在未来十年内仍是机器学习的首选语言

愚者多怨,仁者不言,生活中就是会有很多爱唱反调的人,但不管怎么说Python 在接下来十年仍然会很重....
发表于 2020-11-05 14:38 303次阅读
Python 在未来十年内仍是机器学习的首选语言

能够指挥AI机器的编程网红Python,被誉为“...

在这样的背景之下,我国也非常重视Python的教育:浙江已经把Python列为中学生必修项目;山东、....
发表于 2020-11-05 14:09 520次阅读
能够指挥AI机器的编程网红Python,被誉为“...

20年来首次:Java被编程语言 Python超...

日前,TIOBE公布了最新一期的编程语言排行榜(11月)。 接近20年来的首次,Java和C没有分享....
发表于 2020-11-05 13:28 313次阅读
20年来首次:Java被编程语言 Python超...

20年来首次。Java掉出全球最受欢迎的两大编程...

日前,TIOBE公布了最新一期的编程语言排行榜(11月)。接近20年来的首次,Java和C没有分享前....
发表于 2020-11-05 12:11 204次阅读
20年来首次。Java掉出全球最受欢迎的两大编程...

如何利用Python判断统计每个月天数源

如何利用Python判断统计每个月天数源。在日常的学习或是工作中会经常遇到需要统计日期数据的情况。特....
发表于 2020-11-02 09:41 345次阅读
如何利用Python判断统计每个月天数源

如何基于 ES6 的 JavaScript 进行...

TensorFlow.js 是 TensorFlow 的 JavaScript 版本,支持 GPU ....
发表于 2020-10-31 11:16 574次阅读
如何基于 ES6 的 JavaScript 进行...

在Python中实现异步编程(附源码)

异步编程是并行编程的一种方式。单个工作单元独立于主应用程序线程运行,并通知调用线程其完成、失败情况或....
发表于 2020-10-27 14:36 363次阅读
在Python中实现异步编程(附源码)

世界上最深奥的编程语言有哪些

当我们谈论 c,c++ ,Java,Python的时候,有些语言不仅很难,而且对于大多数软件开发者来....
发表于 2020-10-25 10:13 327次阅读
世界上最深奥的编程语言有哪些

TIOBE已公布2020年10月的编程语言排行榜

Python从去年开始就已经登上了TIOBE榜单的第三位,但它的受欢迎程度一直在上升,本月,该指数达....
发表于 2020-10-23 10:41 5783次阅读
TIOBE已公布2020年10月的编程语言排行榜

Python受欢迎程度直上升 即将超过Java

来自:程序猿(ID:imkuqin) TIOBE已公布2020年10月的编程语言排行榜。C语言依然排....
发表于 2020-10-23 10:41 400次阅读
Python受欢迎程度直上升 即将超过Java

Go为什么是2020年最受欢迎的语言?

在接下来的几年中,Python无疑还将继续在这些领域占据主导地位。但是,与一些新兴语言相比,它存在一....
发表于 2020-10-23 10:37 357次阅读
Go为什么是2020年最受欢迎的语言?

STM32的backtrace深度讲解(cort...

STM32上的backtrace原理与分析 1.说明 2.cortex-m上的栈布局 2.1 cor....
发表于 2020-10-22 15:13 576次阅读
STM32的backtrace深度讲解(cort...

2020年10月编程语言排行榜:Python即将...

来源:菜鸟教程 TIOBE 2020 年 10 月份的编程语言排行榜已经公布,官方的标题是:Pyth....
发表于 2020-10-19 11:37 521次阅读
2020年10月编程语言排行榜:Python即将...

为什么一定要学Python 答案太扎心了

今年秋招太难了。毕业生们纷纷表示心酸: 投了100份简历,面试邀请为0;别说大公司了,就连名不见经传....
发表于 2020-10-13 17:36 356次阅读
为什么一定要学Python  答案太扎心了

集中讨论谷歌、亚马逊等技术巨头使用Python开...

十年前,由于编程语言种类匮乏,开发人员不必苦恼自己应该选择哪一种编程语言;但是现在,世界上正在使用的....
发表于 2020-10-11 09:51 550次阅读
集中讨论谷歌、亚马逊等技术巨头使用Python开...

Python编程已经走进中小学课堂

在编程世界,关于哪个语言是最好的争论从未停止,虽然道理谁也不服谁,但是关于编程的热度,我们可以从TI....
发表于 2020-10-10 17:10 400次阅读
Python编程已经走进中小学课堂

如何系统型的学习深度学习?

更要命的是,我发现我一直都是在写算法,从没考虑过如何部署模型,也就是整天纸上谈兵。所以我最近开始学网....
发表于 2020-10-10 10:39 367次阅读
如何系统型的学习深度学习?

10个流行的Python库平台

作为开发人员喜爱的语言之一,Python以其丰富的社区可用工具和库而闻名。我们列出了开发人员可以用于....
发表于 2020-10-09 16:33 314次阅读
10个流行的Python库平台

Python在人工智能领域为什么如此受欢迎?

人工智能已成为我们日常生活不可或缺的一部分,它被广泛地应用到几百种实际场景中,极大地便利人们的工作和....
发表于 2020-09-30 11:09 470次阅读
Python在人工智能领域为什么如此受欢迎?
博评网