python导出依赖库,python缺少库
python教程栏目介绍实现自动导入缺失的库。
导入失败通常有两种:一种是导入自己编写的模块(即带有。py后缀),另一种是导入第三方库。本文主要讨论第二种情况,以后有机会再详细讨论其他相关话题。
解决Python库导入失败的问题,其实关键是在运行环境中安装缺失的库(注意是不是虚拟环境),或者使用合适的替代。这个问题分为三种情况:
00-1010在编写代码时,如果我们需要使用第三方库(比如requests),但我们不确定实际运行环境是否安装了它,那么可以这样做:
尝试:导入请求例外导入错误:导入操作系统
OS.system (pip安装请求)导入请求复制代码。这种写法的效果是,如果找不到请求库,将首先安装它,然后导入。
在一些开源项目中,我们可能还会看到以下写法(以json为例):
Ry:导入simplejson为json除了导入错误3360导入json复制代码这样写的效果是先导入第三方库simplejson。如果找不到,就用内置的标准库JSON。
这种编写方式的优点是不需要导入额外的库,缺点是需要保证两个库兼容使用。如果在标准库中找不到替代库,那就不可行。
如果实在找不到兼容的标准库,也可以自己写一个模块(比如my_json.py),实现自己想要的,然后在except语句中导入。
Ry:导入simplejson为json除了导入错误3360导入my _ json为JSON复制代码代码不好乱说。两句话:如需学习资料或有技术问题,只需交流“点击”
上述00-1010的想法是针对正在开发的项目,但它有几个缺点:
1.pip安装代码中每个可能缺失的第三方库是不可取的;
2.第三方库不能被标准库或手写库取代。我该怎么办?
3.如果形成的项目不允许这些修改怎么办?
所以这里的问题是:有一个项目,我想部署到一台新机器上。涉及到很多第三方库,但都不是预装的。我该怎么办?
对于一个符合规范的项目,根据协议,它通常包含一个“requirements.txt”文件,该文件记录了项目的所有依赖库及其所需的版本号。这是在项目发布之前使用命令pip freeze requirements.txt生成的。
使用命令pip install -r requirements.txt(在文件所在的目录下执行,或者在命令中写入整个文件的路径),就可以自动安装所有的依赖库。
但是,如果项目不达标,或者由于其他不幸的原因,我们没有这样的文件,怎么办?
一个愚蠢的方法是运行项目,等待它出错,当库指南失败时手动安装一个,然后再次运行项目,当库指南失败时安装它,等等.
00-1010有没有更好的自动导入缺失库的方法?
有什么方法可以在不修改原代码,不需要“requirements.txt”文件的情况下,自动导入需要的库?
当然有!先看效果:
以龙卷风为例。第一步,我们可以看到我们没有安装tornado。第二步之后,当我们再次导入tornado时,程序会自动为我们下载安装tornado,所以不会报错。
Autoinstall是我们的手写模块,包含以下代码:
#以下代码在Python 3 . 6 . 1版通过import sys import OS从import lib import _ module类auto install () :中验证。
_已加载
= set() @classmethod
def find_spec(cls, name, path, target=None):
if path is None and name not in cls._loaded:
cls._loaded.add(name)
print("Installing", name) try:
result = os.system('pip install {}'.format(name)) if result == 0: return import_module(name) except Exception as e:
print("Failed", e) return Nonesys.meta_path.append(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
,可以自动导入任意的缺失库
相关免费学习推荐:python教程(视频)以上就是学习在python中实现自动导入缺失的库的详细内容,更多请关注盛行IT软件开发工作室其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。