Python包的安装与导入详解(whl, egg)

python的包有3种安装或使用的形式: 源码导入, 从.whl安装和从.egg安装

源码导入

保持源代码, 直接以__init__.py和源码的文件形式导入项目, 再使用

从.whl文件安装导入

通过pip install把 .whl形式的打包好的python包安装, 此时整个包会以source+meatadata的形式存放在.conda/envs/env_name/lib/python3.x/site-packages中, 比如pytorch装完后就会在那里新增torch和torch-1.10.0+cu111.dist-info这两个文件夹, 前者包含了__init__.py, torch.nn等源码和依赖的c++后端动态库, 后者就是告诉pip我这个包叫啥, 版本链接, 以及指向的源码位置

本地打包生成.egg文件, 再导入

  • 通过python的setuptools进行项目的本地打包和安装. 在一些常用的项目中, 如PaddleDetection, 常常会提供由源码安装库的渠道. 开发者写好配置文件, 然后由用户执行python setup.py install完成库的本地打包和安装

    • install这个指令其实由build 和install两步完成, build做的事情是把目标源码复制到./build/lib/package_name这个地方. 而install做的就是把这些源码编译成字节码, 再把元数据文件也复制过来, 将字节码和元数据拼成一个.egg格式的压缩包, 再把这个压缩包复制到 .conda/envs/env_name/lib/python3.x/site-packages中, 这样的话pip就知道新增了一个包了

    • egg形式的包, 可用, 但是会有两个问题: 不可修改源码和不可跳转代码

      • 先说不可修改源码, 在site-packages中, 别的以.whl格式安装的包都是把源码直接暴露出来的, 解释器直接按照逐行运行源码的形式导入和读取、运行那些源码, 所以我们直接就能修改, 修改后也可以立即生效. 但是.egg形式的包完全是一个压缩包, 解释器直接读取整个压缩包, 用户是进不去内部的, 这就导致你修改不了源码. ** 此处还需要注意的是, 改原项目的代码或者改build/lib里面的代码屁用没有, 因为真正拿来运行的部分被压缩到.egg中放在site-packages里了**

      • 再说不可跳转代码, 这一点也很烦, vscode跳转代码是依靠读取整个 .conda/envs/env_name/lib/python3.x/site-packages中所有的__init__.py 实现的接口登记, 现在.egg就一个压缩包在那里, 也就没法读取了

      • 那怎么办呢? 其实非常简单, 找到那个压缩包, 比如说是paddleSlim.egg, 直接执行unzip -o paddleSlim.egg -d new, 然后删除paddleSlim.egg,再将new文件夹重命名为paddleSlim.egg即可, 这样的话压缩起来的源码就暴露出来了, 也能跳转也能修改了

你可能感兴趣的:(Python基础和进阶,python,pytorch,深度学习)