Anaconda完全离线环境迁移
问题:anaconda的离线环境迁移一直是一个问题,虽然论坛中给出了很多种所谓的离线迁移方法,但是这些方法存在有如下问题:
- 将anaconda整体复制:conda list会报错,或许还有一些潜在的错误。
- 使用pip导出requirements.txt,然后下载离线包。这个方法看似可行,但是用pip导出的包清单不仅包括pip的,还包括conda安装的,pip下载的过程中很多conda安装的包并不能找到。
基于上诉问题,笔者提出了如下方法。
在这里,首先假定A为能上网的需要迁移出环境的机器;B为不能上网的需要迁移入环境的机器。
1. 检查A机环境中的包是否存在不兼容现象
这一步十分关键,如果存在不兼容,B机无法安装!
用pip检查
命令:Pip check
具体问题具体分析,建议用conda装(对于依赖的检测安装功能更加强大)
2. 用conda导出依赖清单
为什么使用conda导出?因为现在版本的conda不仅可以导出conda安装的依赖,同时也可以导出pip安装的依赖,一举两得。
进入A机的anaconda环境,导出依赖清单:(一定要先conda list否则容易丢包)
conda list
conda env export > your_env.yaml
清单图如下,可以看到这里分别有conda依赖清单和pip依赖清单。
dependencies:
- alabaster=0.7.12=py_0
- astroid=2.4.2=py36h9f0ad1d_0
- async_generator=1.10=py_0
- attrs=20.2.0=pyh9f0ad1d_0
- babel=2.8.0=py_0
- backcall=0.2.0=pyh9f0ad1d_0
- backports=1.0=py_2
- backports.functools_lru_cache=1.6.1=py_0
- bleach=3.2.1=pyh9f0ad1d_0
- ca-certificates=2021.5.30=h5b45459_0
- certifi=2021.5.30=py36ha15d459_0
- chardet=3.0.4=py36h9f0ad1d_1007
- colorama=0.4.3=py_0
- cudnn=6.0=0
- decorator=4.4.2=py_0
- defusedxml=0.6.0=py_0
- docutils=0.16=py36h9f0ad1d_1
- entrypoints=0.3=py36h9f0ad1d_1001
- webencodings=0.5.1=py_1
- wheel=0.35.1=pyh9f0ad1d_0
- widgetsnbextension=3.5.1=py36h9f0ad1d_1
- wincertstore=0.2=py36_1003
- winpty=0.4.3=4
- wrapt=1.11.2=py36h68a101e_0
- zeromq=4.3.2=h6538335_2
- zipp=3.3.0=py_0
- zlib=1.2.11=h2fa13f4_1004
- pip:
- absl-py==0.10.0
- altgraph==0.17
- argon2-cffi==20.1.0
- astor==0.8.1
- atomicwrites==1.4.0
- autopep8==1.5.4
- bcrypt==3.2.0
- blessings==1.7
- cachetools==4.1.1
- cffi==1.14.3
- cloudpickle==1.6.0
- cryptography==3.4.7
- cycler==0.10.0
- dataclasses==0.8
3. 修改依赖清单列表
- 在A机上建立一个txt文件,命名为conda.yaml,其中复制入dependencies中的依赖名称(不包含dependencies)。并将“XXX -”替换为“”(XXX表示空格,替换为空),如果不修改,安装时报错。记事本编辑\替换可以完成这个操作。修改完成的清单如下:
alabaster=0.7.12=py_0
astroid=2.4.2=py36h9f0ad1d_0
async_generator=1.10=py_0
attrs=20.2.0=pyh9f0ad1d_0
babel=2.8.0=py_0
backcall=0.2.0=pyh9f0ad1d_0
backports=1.0=py_2
backports.functools_lru_cache=1.6.1=py_0
bleach=3.2.1=pyh9f0ad1d_0
ca-certificates=2020.6.20=hecda079_0
certifi=2020.6.20=py36h9f0ad1d_0
chardet=3.0.4=py36h9f0ad1d_1007
colorama=0.4.3=py_0
cudatoolkit=10.0.130=0
cudnn=7.6.0=cuda10.0_0
decorator=4.4.2=py_0
- 在A机上再建立一个txt文件,命名为pip.txt。在其中复制入pip:内的部分。按照1步中的方法,将“ -”替换为“”。修改后的依赖清单为:
absl-py==0.10.0
altgraph==0.17
argon2-cffi==20.1.0
astor==0.8.1
atomicwrites==1.4.0
autopep8==1.5.4
bcrypt==3.2.0
blessings==1.7
cachetools==4.1.1
cffi==1.14.3
cloudpickle==1.6.0
cryptography==3.4.7
cycler==0.10.0
注意:conda和pip对于依赖的命名是不同的!依赖清单可以加入自己其他的本地包名称。
4 获取依赖安装包
4.1 获取conda依赖安装包
进入A机anaconda安装根目录中的pkgs(注意不是环境中的),拷贝出所有的“.conda”,“.tar.bz2”文件到‘condafile’,上面的文件为这些包的解压文件。这些文件就是以前用conda安装时下载的安装包文件。
4.2 下载pip依赖安装包
在A机上利用pip根据pip.txt中的清单下载依赖包。这里我cd到了Desktop,-r表示依赖清单,-d表示存储依赖的路径。
pip download -r pip.txt -d pipfile
之后将这两部分的文件拷贝到另一个文件下,笔者命名为pipfile。
最终在A机上建立如下结构的文件:
--\transference
--\condafile
--\conda.yaml
--\pipfile
--\pip.txt
5 B机安装依赖
在B机上安装好anaconda之后,离线创建环境,并进入环境:
conda create -n csdntest --offline
conda activate csdntest
5.1 Conda依赖安装
将前面的transference拷贝到B机桌面上,cd到该路径下,按照conda.yaml从transference离线安装依赖。
- 将condafile里面的所有文件拷贝到anaconda安装根目录下的pkgs,重复的文件复制或替换,这个目录就是conda的安装的缓存目录。
- Cd 到conda.yaml 的目录下
Conda install --file conda.yaml --offline
- 安装过程中可能会报错,可能是由于安装了其他python版本的包,或者是其依赖库没有找到。具体问题具体分析,下载相对应的库。
可以看到conda的软件已经全部安装,当然包括python和pip,这样一下步就可以使用pip安装了。
5.2 Pip依赖安装
同样的操作:
- Cd 到pip.txt 的路径下
Pip install -r pip.txt --no-index --find-links=. --user
导入第三方包,测试表明,环境顺利迁移!
小问题:
如果使用pip freeze > requirements.txt
命令导出已安装的模块,其中部分模块显示了 @ file:///…,而不是具体的版本号。
原因:
这是 pip 安装软件包的一种特殊语法(自19.1开始受支持)PEP404,但是该此种路径取决于环境,file:///URL 仅在本地文件系统上可用,你不能将生成的 requirements.txt 文件提供给其他人使用
解决:
当你遇到此类问题时,可以暂时考虑使用如下命令生成 requirements.txt 文件
pip list --format=freeze > requirements.txt
使用上述命令导出的文件中,会包含如下几个包:distribute,pip,setuptools,wheel,建议手动删除!
————————————————
该部分为CSDN博主「zzzzls~」的原创文章,遵循CC 4.0 BY-SA版权协议,原文链接:https://blog.csdn.net/qq_36078992/article/details/109435000
搞了劳资一天!!!