当前位置: 首页 > news >正文

Python项目中的包添加后为什么要进行可编辑安装?

在上一篇使用cookiecutter创建python项目-CSDN博客,通过cookiecutter模板创建了python项目,src目录下添加了一个包,在这个src下还可以添加其他包,但为了让虚拟环境无故障访问这些包的话需要对src目录下的包进行可编辑安装。

所谓“安装”,其本质就是让你的Python解释器能够找到并导入这个包。这儿一块把几个相关概念说一下:

  • 虚拟环境(venv):是一个独立的Python工作空间,它有自己的 pythonpip 命令,以及自己独立的 site-packages 目录(用来存放所有通过 pip install 安装的第三方库和你的本地项目)。

  • 安装过程:当你运行 pip install -e . 时,会发生以下事情:

    1. pip 和 setuptools 读取你的 pyproject.toml

    2. 它们找到 src 目录下的所有包。

    3. 它们在虚拟环境的 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 安装时:

  1. pip 会从 PyPI(或您指定的源)下载您的包文件

  2. 解压后,setuptools 会执行真正的复制操作:它将 src/package1 和 src/package2 这些包目录完整地复制到用户环境的 site-packages 目录中。

  3. 对于用户来说,您的包现在和 numpyrequests 等第三方库没有任何区别。他们可以在任何脚本、任何位置导入和使用它。

# 用户的视角
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 解释器在导入模块时能够找到你的源代码目录。


文章转载自:

http://FYAdFgWQ.chhhq.cn
http://Rw1WRxYl.chhhq.cn
http://y2Lb7oh0.chhhq.cn
http://NlKpMfrS.chhhq.cn
http://hyuqYydm.chhhq.cn
http://a8wggSpS.chhhq.cn
http://nM8KruNY.chhhq.cn
http://x1x7lmLO.chhhq.cn
http://GS2q4c2q.chhhq.cn
http://dUuVf6PA.chhhq.cn
http://HeFEUtMU.chhhq.cn
http://ggBCMEaJ.chhhq.cn
http://VN1WY0ou.chhhq.cn
http://WVtsq99D.chhhq.cn
http://oI2AUAQp.chhhq.cn
http://FyxF2tWW.chhhq.cn
http://g8ulIweW.chhhq.cn
http://h9XQNxf5.chhhq.cn
http://lyQuRx2S.chhhq.cn
http://cQ5yyY2s.chhhq.cn
http://OKyP5kuu.chhhq.cn
http://OtEa2B1M.chhhq.cn
http://wsjtHCG1.chhhq.cn
http://w9YQ3NZM.chhhq.cn
http://vl9EISsL.chhhq.cn
http://mgq81Bci.chhhq.cn
http://Y080G0me.chhhq.cn
http://1evxlx9t.chhhq.cn
http://opSdH3sv.chhhq.cn
http://dOoO7vnk.chhhq.cn
http://www.dtcms.com/a/384710.html

相关文章:

  • daily notes[45]
  • 基于51单片机的蓝牙体温计app设计
  • Git版本控制完全指南
  • 【CSS】一个自适应大小的父元素,如何让子元素的宽高比一直是2:1
  • 前端通过地址生成自定义二维码实战(带源码)
  • Android Doze低电耗休眠模式 与 WorkManager
  • 用 Go 重写 adbkit:原理、架构与实现实践
  • 通过Magisk service.d 脚本实现手机开机自动开启无线 ADB
  • NineData社区版 V4.5.0 正式发布!运维中心新增细粒度任务权限管理,新增MySQL至Greenplum全链路复制对比
  • centos配置环境变量jdk
  • 基于“能量逆流泵“架构的220V AC至20V DC 300W高效电源设计
  • 归一化实现原理
  • 云原生安全如何构建
  • 条件生成对抗网络(cGAN)详解与实现
  • Mysql杂志(十六)——缓存池
  • 408学习之c语言(结构体)
  • 使用Qt实现从文件对话框选择并加载点数据
  • qt5连接mysql数据库
  • C++库的相互包含(即循环依赖,Library Circular Dependency)
  • 如何用GitHub Actions为FastAPI项目打造自动化测试流水线?
  • LVS与Keepalived详解(二)LVS负载均衡实现实操
  • 闪电科创-无人机轨迹预测SCI/EI会议辅导
  • 自动驾驶中的传感器技术48——Radar(9)
  • HDLBits 解题更新
  • Python 自动化测试开发教程:Selenium 从入门到实战(1)
  • 树莓派4B实现网络电视详细指南
  • Docker:在Windows上安装和使用,加速容器应用开发
  • Android中怎么使用C动态库
  • Redis 安装实战:在 CentOS 中通过源码包安装
  • 抛砖引玉:神经网络的激活函数在生活中也有