python导出依赖库,python缺少库

  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 ,我们先打印一下,看看它是个什么东西?

  

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

      

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

      

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

      

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

      

  5. 若未找到,抛出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 几乎不受人关注的机制,但它可以做很多事,例如加载网络上的库、在导入模块时对模块进行修改、自动安装缺失库、上传审计信息、延迟加载等等。

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

  

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

      

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

      

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

      

相关免费学习推荐:python教程(视频)

  

以上就是学习在python中实现自动导入缺失的库的详细内容,更多请关注盛行IT软件开发工作室其它相关文章!

  

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: