Pip wheel行为变更:如何让新版本恢复临时目录构建模式?
解决新版Pip
wheel 命令直接修改原源码目录的问题 为什么会出现这个差异?
Pip在21.0版本左右调整了构建逻辑,默认启用原地构建(in-tree build),不再自动把源码复制到临时目录操作。这个变更是为了减少磁盘IO、提升构建效率,但会导致你的setup.py里的文件删除操作直接影响到本地源码树。
恢复旧行为的两种方式
1. 命令行参数临时指定临时构建目录
执行pip wheel时,手动指定一个临时构建目录,强制Pip复制源码过去操作,完全模拟旧版行为:
pip wheel --no-deps --build-dir "$(mktemp -d)" .
$(mktemp -d)会自动创建一个临时目录,构建完成后可以手动删除,或者系统会自动清理。
2. 全局配置永久启用旧模式
如果需要所有Pip构建都用旧行为,可以修改Pip的配置文件:
- Linux/macOS:修改
~/.config/pip/pip.conf - Windows:修改
%APPDATA%\pip\pip.ini
在配置文件中添加以下内容:
[global] use-feature = -in-tree-build
这会全局禁用原地构建特性,让Pip回到复制源码到临时目录的旧逻辑。
备选方案:修改setup.py适配新逻辑
如果不想依赖Pip参数,也可以调整setup.py,让它只在构建临时环境中修改文件:
- 在setup.py中先复制需要处理的文件到临时路径,再对副本进行删除/修改操作
- 或者检测当前目录是否为Pip的临时构建目录(可以通过环境变量或目录特征判断),仅在非源码目录时执行删除操作
补充细节
这个行为变更属于Pip 21.0版本对PEP 517/518构建流程的优化,官方在版本变更日志中提到了该调整,但没有在pip wheel的单独文档中突出说明。
内容的提问来源于stack exchange,提问作者Evan
相关产品推荐
相关产品推荐

