"pip install" 何时构建 wheel?
"pip install" 何时构建 wheel?
我发现在不同的文件夹中,有时候pip install
会构建wheel,这需要很长时间,而有时候却不会。我不确定为什么会这样,也不知道如何控制。
我的命令:bin/python -m pip install -r ../requirements.txt
(由于!#
的shebang行长度限制,所以我不直接使用pip)
没有构建wheel的输出(只需几秒钟):
Collecting numpy==1.10.4 (from -r ../requirements.txt (line 1)) Installing collected packages: numpy Successfully installed numpy-1.10.4
构建了wheel的输出(至少需要2分钟):
Collecting numpy==1.10.4 (from -r ../requirements.txt (line 1)) Downloading numpy-1.10.4.tar.gz (4.1MB) 100% |████████████████████████████████| 4.1MB 92kB/s Building wheels for collected packages: numpy Running setup.py bdist_wheel for numpy ... done Stored in directory: /root/.cache/pip/wheels/66/f5/d7/f6ddd78b61037fcb51a3e32c9cd276e292343cdd62d5384efd Successfully built numpy Installing collected packages: numpy Successfully installed numpy-1.10.4
requirements.txt
的内容:
numpy==1.10.4
当我们使用"pip install"命令安装Python包时,有时会遇到重新构建wheel的问题。在第一次安装包时,pip会构建一个wheel,然后将其缓存起来。在后续的安装过程中,pip会直接从缓存中读取已构建的wheel,而不再重新构建。下面是解决这个问题的方法:
1. 清除缓存:
pip install --no-cache-dir
这个命令会强制pip不使用缓存,并重新构建wheel。
2. 升级pip:
pip install --upgrade pip
有时,旧版本的pip可能会导致重新构建wheel的问题。通过升级pip到最新版本,可以解决这个问题。
3. 使用--use-wheel选项:
pip install --use-wheel
这个选项会告诉pip在安装包时优先使用已构建的wheel,而不重新构建。
通过上述方法,我们可以解决"pip install"命令重新构建wheel的问题,从而提高包安装的效率。
当执行"pip install"命令时,会在什么情况下生成wheel文件?
今天遇到了一个问题,一个包的安装出现了问题,原因是该包的构建过程生成了错误的wheel文件,尽管直接安装工作正常。
经过一番调查,我发现目前(pip == 8.1.2),没有直接的方法来控制pip是否尝试从给定的包构建wheel。我找到了相关的源代码,并且发现wheel构建过程仅在以下情况下使用:
- wheel模块可导入
- 使用了缓存目录
基于这个逻辑,我们可以通过在安装命令行中添加"--no-cache-dir"来间接禁用pip使用基于wheel的构建。
看起来这个逻辑已经有了很大的改变(现在是pip == 19)。现在的代码可以追溯到github.com/pypa/pip/blob/…。不幸的是,在保留已经有wheel文件的包的情况下,似乎没有方便的标志可以关闭wheel构建功能(除了卸载wheel)。
实际上,你可以通过设置"--no-binary={package_name}"来指定哪些包不应该生成wheel文件。
pip还有"--only-binary"和"--prefer-binary"参数。
当你使用"pip install"命令安装一个包时,是否会生成一个wheel文件取决于这个包是纯Python包还是包含了C源代码的包。如果是纯Python包,那么不需要编译,只需要将文件复制到某个地方即可。如果包含了C源代码,那么就需要进行编译,执行编译器的调用和执行,这个过程会比较耗时。
关于wheel文件的更多信息,可以参考wheel的文档:http://wheel.readthedocs.org/en/latest/
至于numpy是否是一个纯Python包,这可以决定是否会由Python来构建一个wheel文件。但是这并没有解释为什么有时会生成wheel文件,有时又不会,正如问题所示。
解决方法暂时没有给出。