pip wheel -e与pip install -e的差异及C扩展构建表现解析
关于Python C扩展库两种安装方式差异的原理解析
核心差异背后的原理
这两种方式本质是pip的可编辑安装(editable install)和wheel打包安装的区别,针对C扩展这类需要编译的包,处理逻辑差异明显:
1. pip install -e .(可编辑安装)
- 本质是把项目源码目录挂载到Python的site-packages中,不会真正将编译后的文件"安装"到系统路径,而是通过
*.egg-info目录和*.pth文件让Python能直接找到源码。 - 编译行为:仅编译C扩展到源码目录下的临时位置,Python运行时直接加载源码目录里的编译产物,无需复制到site-packages。
pip list显示Editable project location:因为这种安装方式会记录源码路径,方便修改源码后立即生效,无需重新执行安装命令。- 产物少:仅生成
*.egg-info目录(存储包元数据)和少量临时编译文件,不会保留完整的构建中间产物。
2. pip wheel -e . + 安装wheel包
pip wheel -e .会先以可编辑模式完成完整构建流程:生成包含所有编译中间文件、最终扩展模块的build目录,再将这些产物打包成wheel文件。- 安装wheel包时,是把wheel里的预编译产物直接复制到Python的site-packages目录,和源码目录完全脱离关系。
pip list无Editable project location:因为安装的是预编译的wheel包,属于常规安装,不会关联源码路径,修改源码后必须重新打包安装才能生效。- 产物多:
build目录会保留完整的构建过程文件,wheel包本身也包含编译好的二进制模块。
pip的处理流程差异
pip install -e .的执行流程:- 解析setup.py/setup.cfg,生成
*.egg-info元数据目录 - 编译C扩展到源码目录的临时位置(如
__pycache__或专属临时目录) - 在site-packages中添加
*.pth文件,指向项目源码目录 - 将可编辑安装的源码路径记录到pip的元数据中,因此
pip list会显示该路径
- 解析setup.py/setup.cfg,生成
pip wheel -e .+ 安装wheel的执行流程:pip wheel -e .:执行完整的构建流程,生成build目录存放编译后的C扩展、对象文件等,然后将所有必要文件打包成wheel格式- 安装wheel包:解压wheel包,将预编译的扩展模块、包文件直接复制到site-packages目录,不会生成关联源码的
*.pth文件,也不会记录源码路径
是否可以分步执行pip install?
可以分步执行,本质是手动拆分pip install的内置流程:
- 方式一:先编译再安装
- 执行
python setup.py build或pip wheel .,完成C扩展的编译,生成build目录和编译产物 - 执行
pip install .,此时pip会优先使用已编译的产物,避免重复编译
- 执行
- 方式二:先构建wheel再安装wheel
- 执行
pip wheel .,生成wheel包文件 - 执行
pip install ./your-package-*.whl,安装预编译的wheel包
- 执行
这种分步方式适合需要保留编译产物、或在不同环境复用预编译包的场景,最终效果和直接执行pip install .一致,但能手动控制构建和安装的步骤。
内容的提问来源于stack exchange,提问作者not2qubit
相关产品推荐
相关产品推荐

