安装包时是否可以保存 pip 编译的二进制文件?

安装包时是否可以保存 pip 编译的二进制文件?

我正在开发一个 Raspberry Pi 3 项目。我的项目需要的东西之一是 cython。

在 virtualenv 内的 Raspberry Pi 上运行pip install cython大约需要 40 分钟才能完成,因为 cython 显然需要首先编译。在这 40 分钟内,top显示 cc 正在运行,尝试编译内容,100% 使用一个核心。

我每天需要多次执行此操作,因为我一直需要将 SD 卡重置为 Raspbian 的新映像。这显然非常耗时,并且会减慢进度。

当 pip 编译完 cython 后,二进制文件存储在哪里?在虚拟环境中?文件系统上的其他地方?

如果它们存储在 virtualenv 中,我可以存档整个 virtualenv 文件夹,并将其恢复到新的 Linux 中,并期望它能够工作吗?我知道 virtualenv 不应该是可移植的(不使用 arg --relocatable,这似乎有其自己的问题),但就我而言,当我恢复 virtualenv 时,virtualenv 的路径将保持不变。

答案1

只需从缓存目录复制轮文件即可。当pip install pkgname发出并且pip找不到可安装的兼容轮时,它会从源 dist 构建一个轮并将其存储在缓存中以供将来重新安装时重用。要查找wheel文件,请发出

$ find $HOME/.cache/pip -type f -name Cython*.whl

备份文件;要从本地文件安装,只需发出

$ pip install path/to/file.whl

从这里去哪里:本地存储库

当您收集了大量预构建的轮子时,下一步将是设置一个本地 PyPI 存储库来安装。最简单的方法是将轮子组织到以包命名的目录中并运行一个简单的 HTTP 服务器:

└── repodir
    ├── Cython
    │   └── Cython-0.28.0-cp36-cp36m-linux_aarch64.whl
    ...

使用例如启动服务器

$ python3 -m http.server -p 9000

现在您可以将存储库传递给pip

$ pip install Cython --extra-index-url=http://127.0.0.1:9000

或者甚至将存储库 URL 保留在 to 中,pip.conf以免每次都输入它:

# pip.conf
[global]
extra-index-url=http://127.0.0.1:9000

如果你想要了解更多,有很多不错的 PyPI repo 服务器可供选择,devpi它们提供多功能包管理、Web UI 等。

相关内容