Python项目中的包添加后为什么要进行可编辑安装?
在上一篇使用cookiecutter创建python项目-CSDN博客,通过cookiecutter模板创建了python项目,src目录下添加了一个包,在这个src下还可以添加其他包,但为了让虚拟环境无故障访问这些包的话需要对src目录下的包进行可编辑安装。
所谓“安装”,其本质就是让你的Python解释器能够找到并导入这个包。这儿一块把几个相关概念说一下:
-
虚拟环境(venv):是一个独立的Python工作空间,它有自己的
python、pip命令,以及自己独立的site-packages目录(用来存放所有通过pip install安装的第三方库和你的本地项目)。 -
安装过程:当你运行
pip install -e .时,会发生以下事情:-
pip和setuptools读取你的pyproject.toml。 -
它们找到
src目录下的所有包。 -
它们在虚拟环境的
site-packages目录中创建一个特殊的链接文件(.pth文件或一个egg-link文件)。这个文件不复制你的代码,而是简单地指向你项目的真实位置(即你电脑上那个包含pyproject.toml的文件夹)。
-
-
安装后的效果:
-
你的代码仍然物理存放在你原来的项目文件夹里(比如
/Users/yourname/code/my_project/src/package1/...)。你可以随时编辑它们。 -
但是,Python解释器现在“以为”这个包已经安装在它的
site-packages里了。因为那个链接文件告诉解释器:“当有人想导入package1时,请你去这个地址找。” -
因此,你可以在系统的任何地方(比如你的终端Python shell,或者项目外的另一个脚本),像导入
numpy一样导入你的包:# 无论你在哪个目录下运行Python,现在这行代码都能工作了! from package1 import some_module -
因为用了
-e(可编辑模式),你对代码的任何修改都会立即生效,无需重新安装。
-
其实就是在package中建立一个对你的包的引用,-e就是说这个引用(或者超链接)是实时的,你改了src下的源代码,你这个引用就立即生效了。
当你添加了新的包(假设为package2)以后,需要重新执行安装命令:
pip install -e
setuptools 会自动扫描 src 目录,发现新添加的 package2 包并将其一并安装。
验证安装,在任何目录下执行:
python -c "import package1; print('成功:从项目根目录导入')"
都能返回成功,就说明是安装好了,如果是只在项目目录执行上面的代码成功,其他目录没有成功说明还没有安装成功。
pip install -e . 的目的是消除这种上下文依赖,让您的包像 numpy 或 pandas 一样,可以在任何地方被稳定、可靠地导入。这是专业项目开发的标准实践。
典型应用场景
当运行 python -m build 构建一个分发包(如 .whl 或 .tar.gz 文件),然后别人通过 pip install your-package-name 安装时:
-
pip会从 PyPI(或您指定的源)下载您的包文件。 -
解压后,
setuptools会执行真正的复制操作:它将src/package1和src/package2这些包目录完整地复制到用户环境的site-packages目录中。 -
对于用户来说,您的包现在和
numpy,requests等第三方库没有任何区别。他们可以在任何脚本、任何位置导入和使用它。
# 用户的视角
pip install mds-workbench # 安装您发布的包# 然后在他们项目的任何文件中
from package1 import awesome_tool
from package2 import loaders
# 完全无需关心您的代码物理上在哪
所以,pip install -e . 是 pip install .(复制安装)的“可编辑”版本,用于开发阶段。而最终分发时,是要去掉 -e 的,进行复制安装。
所以,现在所做的——创建虚拟环境、使用 src 布局、用 pip install -e . 安装(或者叫注册,这个就更好理解了)——正是在为上述两个最终目标打下最坚实、最专业的基础。 这是一个非常好的实践,它确保了从开发到分发的整个流程的顺畅和可靠。
本质:
运行 pip install -e . 进行可编辑安装后,Python 环境确实会通过特定的文件来记录这种“链接”或“注册”关系。这主要涉及到虚拟环境 site-packages 目录下的两个特殊文件:.egg-link 文件和 .pth 文件。
下面是一个表格,总结了这些文件的作用和位置:
| 文件类型 | 主要作用 | 常见位置(虚拟环境中)示例 | 文件内容示例(假设项目路径为 /home/user/myproject) |
|---|---|---|---|
.egg-link 文件 | 记录项目根目录的路径,便于 setuptools 管理。 | venv/lib/python3.11/site-packages/package1.egg-link | /home/user/myproject\n./src |
.pth 文件 | 将指定路径添加到 Python 的模块搜索路径 sys.path 中。 | venv/lib/python3.11/site-packages/editable-projects.pth | /home/user/myproject/src |
运行 pip install -e . 后,虚拟环境的 site-packages 目录下的 .egg-link 和 .pth 文件共同维护了项目源代码的“可编辑”链接。.egg-link 文件记录了项目根目录的路径,而 .pth 文件则确保了 Python 解释器在导入模块时能够找到你的源代码目录。
