pip install 命令完整区别拆解

pip install 命令完整区别拆解

一、命令拆分说明

命令 A:pip install -r requirements.txt

$ pip install -r requirements.txt

等价于两步操作:

  1. 读取 requirements.txt 中列出的所有第三方库(如 pytest、numpy、python-dotenv 等)
  2. 批量下载并安装这些外部依赖包到当前 Python 环境

命令 B:pip install -r requirements.txt -e .

$ pip install -r requirements.txt -e .

拆成三部分:

  1. -r requirements.txt — 同命令 A,安装所有第三方依赖
  2. . — 代表当前项目根目录(即包含 pyproject.toml / setup.cfg 的目录,即本地代码包,如 borehole_extractor
  3. -e(= --editable)— 可编辑模式安装本地项目
关键理解 命令 B = 命令 A 的全部功能 + 以可编辑方式安装本地项目代码包。它不是替换关系,而是包含关系。

二、核心区别对照表

对比维度 命令 A:仅 -r 命令 B:-r + -e .
安装内容 只安装第三方依赖,不安装项目代码包本身 先装所有第三方依赖,再以可编辑模式安装本地 borehole_extractor
代码修改生效 修改项目源码后,环境中的代码不会自动更新,导入时仍是旧版本 本地源码实时生效,改完代码无需重新安装,直接生效
模块导入 运行 import borehole_extractor 会报错 ModuleNotFoundError 任意位置都能正常 import borehole_extractor,像第三方库一样使用
适用人群 仅临时运行脚本、不修改项目源码的用户 开发、修改源码、调试、跑单元测试的开发者
底层原理 仅从 PyPI 下载线上包到 site-packages 创建软链接(.pth 文件)指向本地项目文件夹,环境直接读取本地源码
运行测试 失败 pytest 找不到项目模块 通过 pytest 正常识别并测试
运行示例 失败 examples/ 脚本导入报错 通过 examples/ 正常执行

三、直观场景演示

场景 1:只执行命令 A

$ pip install -r requirements.txt
✗ 尝试导入项目模块
>>> import borehole_extractor
ModuleNotFoundError:
  No module named 'borehole_extractor'
✗ 运行单元测试
$ pytest tests/
ERROR: cannot resolve 'borehole_extractor'
  -- no such module in environment
原因 requirements.txt 只记录第三方库(如 numpy、pytest),不会将本地项目注册为 Python 包。Python 解释器根本不知道 borehole_extractor 这个模块的存在。

场景 2:执行命令 B

$ pip install -r requirements.txt -e .
✓ 正常导入项目模块
>>> import borehole_extractor
# 成功!修改源码后再次运行立刻生效
✓ 运行单元测试
$ pytest tests/
===== 12 passed in 0.45s =====
原理 -e . 在 site-packages 中创建了一个指向你项目根目录的链接文件(.pth)。Python 导入时直接走本地源码,因此修改代码后无需重装,即刻生效。

四、-e . 的前置条件与注意事项

必须满足的条件

项目根目录必须包含以下文件之一(任选其一即可),pip 才能识别这是一个可安装的 Python 包:

文件状态说明
pyproject.toml推荐现代 Python 项目标准(PEP 517/518),当前项目已包含
setup.cfg可选setuptools 配置文件,当前项目也已包含
setup.py可选传统方式,已逐步被 pyproject.toml 替代
项目状态确认 若项目同时包含 pyproject.tomlsetup.cfg完全满足条件,可以直接使用 -e .

能否分开执行?

可以。命令 B 本质上是两步合并,拆开写效果完全一样:

# 等价写法:分两步
pip install -r requirements.txt      # 第一步:安装第三方依赖
pip install -e .                    # 第二步:可编辑安装本地项目包

# 等价写法:合并一步
pip install -r requirements.txt -e .

何时只用命令 A 即可?

  • 下载别人的成品脚本,不修改源码
  • 项目不需要作为 Python 库被 import(纯单文件脚本项目)
  • 部署到生产环境时(生产环境通常用 pip install . 而非 -e .

五、-e .(Editable Install)底层原理

执行 pip install -e . 时,pip 并不会把源码复制到 site-packages 目录,而是:

  1. 读取 pyproject.toml(或 setup.cfg)中的包名和入口配置
  2. 在 site-packages 中创建一个 .pth 链接文件,指向项目根目录
  3. 运行 python -c "import borehole_extractor" 时,解释器通过 .pth 文件找到本地源码路径,直接加载本地文件
类比理解 命令 A 好比”买了一本打印好的书”(复制到书架),改了原稿书架上不会变;
命令 B 好比”在书架上放了一张便签,写着’去作者桌上读最新稿'”,作者每次改稿你读到的都是最新版。

一句话总结

pip install -r requirements.txt
只装第三方工具库,不安装项目代码本身
pip install -r requirements.txt -e .
第三方库 + 本地项目代码一起安装,支持实时修改调试,开发专用
开发场景推荐 若需要修改 borehole_extractor 源码、运行 pytest tests/、执行 examples 示例,必须使用带 -e . 的完整命令,否则会频繁出现 ModuleNotFoundError

文档基于 Python pip 官方文档整理