问题
Python的环境迁移是个很容易遇到的问题,在以下情况下均有需求:
1. 自己建了一个环境,要给别人搭一套直接可用的环境。
2. 网络差,无法下载相关三方包。
3. 无法联网,需要离线配置Python环境。
因此,需要一种比较合适可用的环境迁移手段。
直接搜索该问题,很多解决方案都是:1. pip生成requirements.txt,别处直接 pip install;2. mvn pack;3. 直接复制conda的虚拟环境包(envs下的目录)。
方案1并不是很通用,在网络条件好的情况下,可以解决部分问题;方案2,没有尝试,但很多处都提到该方案仅支持迁移conda安装的包,而实际过程中很容易夹杂一些pip安装的包(笔者便是这种情况,因此没有尝试该解决方案);而方案3则是很容易遗留包依赖的问题。
经过长时间的互联网解决方案检索,并通过实际验证,整理出了一套应该是相对比较可用的方案。
解决方案
首先说明,这种环境迁移,其实很适合用docker技术来完成。
这里并不讨论docker技术方案,主要提供Python原生的解决方案。
主要思路是,在本环境下离线Python包,在目标环境下直接安装。
主要用到:pip download 来下载离线包。
本方案实际在ubuntu 16.04, anaconda中经过测试。
1. 下载离线包
此处假定,本地环境已经配置完成,并且能正常使用。
- 首先,使用pip生成requirements.txt文件:
$ pip freeze > requirements.txt
- 然后,根据requirements.txt的包和版本下载离线包:
$ pip download -r requirements.txt -d /path/to/save/packages
此过程如果遇到下载失败的情况,可删除requirements.txt中对应的包记录,由手动下载完成。
手动下载可参考: 1. conda包官网 ;2. 官网pypi源;3. 清华pypi源等。
包的版本,可根据具体测试后升降,以便找到合适能够下载使用的离线包。
2. 安装离线包
- 在目标环境中使用本地离线包安装三方包:
$ pip install --no-index --find-links=/path/to/save/packages -r requirements.txt
此过程中如果遇到安装失败的情况,可考虑直接安装对应包查看问题所在:
$ pip install xxx.whl
直接安装可能会出现 xxx is not a supported wheel on this platform 的报错情况,如果是这种情况不必着急,很可能只是文件命名的问题,改一下包名即可:
具体可以在shell中查看pip支持的文件名格式要求:
>>> import pip
>>> pip.pep425tags.get_supported()
[('cp36', 'cp36m', 'manylinux1_x86_64'), ('cp36', 'cp36m', 'linux_x86_64'),
('cp36', 'abi3', 'manylinux1_x86_64'), ('cp36', 'abi3', 'linux_x86_64'),
('cp36', 'none', 'manylinux1_x86_64'), ('cp36', 'none', 'linux_x86_64'),
('cp35', 'abi3', 'manylinux1_x86_64'), ('cp35', 'abi3', 'linux_x86_64'),
('cp34', 'abi3', 'manylinux1_x86_64'), ('cp34', 'abi3', 'linux_x86_64'),
('cp33', 'abi3', 'manylinux1_x86_64'), ('cp33', 'abi3', 'linux_x86_64'),
('cp32', 'abi3', 'manylinux1_x86_64'), ('cp32', 'abi3', 'linux_x86_64'),
('py3', 'none', 'manylinux1_x86_64'), ('py3', 'none', 'linux_x86_64'),
('cp36', 'none', 'any'), ('cp3', 'none', 'any'), ('py36', 'none', 'any'),
('py3', 'none', 'any'), ('py35', 'none', 'any'), ('py34', 'none', 'any'),
('py33', 'none', 'any'), ('py32', 'none', 'any'), ('py31', 'none', 'any'),
('py30', 'none', 'any')]
举个实例:
笔者在迁移环境时,numpy离线包的文件名为:numpy-1.19.2-cp36-cp36m-manylinux2010_x86_64.whl,查看pip支持的文件名格式要求后,将manylinux2010改为manylinux1之后(新的离线包文件名为:numpy-1.19.2-cp36-cp36m-manylinux201_x86_64.whl),再次安装,即顺利安装成功。
祝大家也能顺利完成环境迁移。
参考资料:
Anaconda环境离线迁移、Windows python环境离线迁移、pip环境离线迁移
Python——pip安装报错:is not a supported wheel on this platform
BUG:
笔者在使用此环境进行迁移时,发现TensorFlow并没有成功的迁移GPU环境(但pytroch可以)。
解决方案参考这篇博客:使用pip download环境conda迁移,TensorFlow无法使用GPU