项目场景:使用Anaconda进行环境离线迁移
在使用Python进行程序开发时,避免不了使用各类的Python包,以最大限度地通过复用模块来减少我们手动编写的代码量,使我们能够更加专注于主体业务逻辑相关的核心代码。谈到Python包的管理以及Python版本的管理,Anaconda是截至目前使用最广泛、最便捷的工具软件之一。特别是在对已有的Python库进行离线迁移的时候,使用Anaconda所带来的便捷性极大地降低了Python环境迁移的时间和人力成本,基本上可以做到使用很简单的若干行命令即可。这里的离线迁移是相对于使用pip freeze的方式导出环境中包的列表,再通过pip install命令通过联网进行安装的方式而言的,即是说将Python环境从一台机器导出,并在另一台没有互联网环境的机器上进行部署的方法。

一般而言,采用Anaconda进行环境离线迁移主要通过如下几步:

以下的5个步骤在windows机器之间进行环境移植,亲测有效!

第一步,使用如下命令创建Python环境

conda create -n env_name python=python_version
 其中env_name为环境名称,python_version为Python版本号,如3.6。

第二步,通过pip install命令,安装所需要配置的Python包

第三步,使用如下命令激活新创建的Python环境

conda activate env_name
第三步,使用如下命令,安装conda-pack工具

conda install -c conda-forge conda-pack
第四步,使用conda pack工具导出当前环境为离线环境

conda pack -n env_name
该过程还可以指定Python环境打包后导出的压缩包名称,只需添加-o参数,例如将上述环境导出为env_name.tar.gz压缩包

conda pack -n env_name -o env_name.tar.gz
第五步,将env_name.tar.gz压缩包拷贝至相同版本的Anaconda安装路径的envs路径下进行解压,并通过命令行激活该环境即可完成迁移

如遇问题:CondaPackError: Cannot pack an environment with editable packages

可添加参数 :--ignore-editable-packages

如: conda pack -n env_name -o env_name.tar.gz --ignore-editable-packages

************************************************************************************************************

问题描述:在打包导出环境时出现_CondaPackError错误
正常情况下采用上述方法可以实现环境的导出及迁移,但当在第二步安装所需要的包的时候,由于其他包的需要,可能会更新由Anaconda安装的包,主要是pip、setuptools、wheel等几个包,导致在使用conda pack进行环境导出时出现_CondaPackError错误,具体如下

_CondaPackError: 
Files managed by conda were found to have been deleted/overwritten in the
following packages:
 
- pip='9.0.1'
 
This is usually due to `pip` uninstalling or clobbering conda managed files,
resulting in an inconsistent environment. Please check your environment for
conda/pip conflicts using `conda list`, and fix the environment by ensuring
only one version of each package is installed (conda preferred).
这个大意是说pip安装的包的版本与conda安装的包的版本冲突了,需要进行统一。笔者尝试了使用pip uninstall将pip卸载的方式,以及采用conda install重新安装pip的方式进行处理,但都导致通过pip list和conda list列出来的包的版本信息出现混乱的问题。在网上进行搜索得到的各路方案,尝试后也没有得到良好的解决。

原因分析及解决方案:关键在于统一化包的版本
从上述报错中可知,环境不能导出主要在于pip和conda安装的包的版本出现了冲突,导致不得不对二者进行统一化处理。既然这样,那么将所有的包的安装,统一安装源就OK了。想到这一层,那么解决方案也就显而易见了,无非就是以下两点:

固化conda安装的包的版本不被修改
后续的包统一采用pip或者conda进行安装
第二点是显而易见的,也是易于操作和实现的。而对于第一点,需要采用如下两步处理方式:

第一步,创建环境时综合考虑初始包的版本,保证满足当前待导出环境中其他包的依赖需求,并在创建环境时设定好版本,例如

conda create -n env_name python=3.6 pip=21.0.1
这样保证了版本兼容性之后,在采用pip安装环境所需要的后续包的时候就不会产生卸载重装已有包更新版本的问题了。

第二步,在迁移后,可能之后还会有新的包补充安装,并面临环境的再次迁移。因此,需注意以下几点:

在安装新的包的时候,注意检查其依赖的包,如果有的依赖包在当前环境中已经安装,则需进一步检查其当初是采用pip安装的还是初始时conda安装的,如果是前者,则可直接采用pip install的命令安装新的包,如果是后者,则需要使用conda install先将依赖包按照所需要的版本安装,然后再使用pip install安装新的包,这样便保证了包版本在pip和conda两边的一致性,进而保证再次导出时不会报上述的错误。

原文链接:https://blog.csdn.net/maximejia/article/details/115385868

**************************************************************************************************

二、python环境移植到Linux系统中

方法步骤:将已安装包的python环境打印(压缩)后上传到Linux系统中,然后在Linux中指定环境路径。

注意:源环境必须也是Linux系统,才能把创建的python环境移植到另一个Linux系统中。

举例:将Ubuntu主机中的py27环境移植到Linux服务器中,服务器没有图形界面。

以下步骤自己测试过,可以实现。

1. Ubuntu主机安装了anaconda

2.打开anaconda软件,使用"anaconda-navigator"命令

3. 在anaconda软件中创建一个py27的环境,

4. 激活新建的py27环境,并安装自己工程需要的包,同时安装conda-pack工具,(或者直接在主机中找到新建的py27环境路径,我的机器的路径是:~/.conda/envs把自己需要的环境打包上传到服务器,我没有进行测试,不知道可行不可行)

        conda install conda-pack

5. 使用conda-pack打包环境

        conda pack -n py27 -o py27.tar.gz

6. 将py27.tar.gz上传到服务器,并解压

        rsync -uvPt py27.tar.gz 远程服务器

        tar -xzvf py27.tar.gz -C ./python_envs/

        用scp命令或rsync命令将文件上传到服务器上。其中使用命令:"rsync -urvtoP 本地源文件路径  远程路径(testusr@192.168.1.3:~/test/)"可以实现增量复制,即只复制新添加的文件,旧文件不复制,这样可以提高复制效率

7. 在服务器上指定路径

        export PATH= ~/python_envs/py27/bin: $PATH

rsync常用参数

rsync -vzrtopg --progress tom@192.168.0.230::common /test     #通common模块指定的/common目录下的文件拷贝到本客户端的/test目录下

参数说明

v:显示详细信息

z:传输过程中对数据进行压缩

r:递归

t:保留修改时间属性

o:保留文件所有者属性

p:保留文件权限属性

g:保留文件所属组属性

a:归档模式,主要保留文件属性,等同于-rlptgoD

--progress:显示数据传输的进度信息

--password-file=FILE:指定密码文件,将密码写入文件,实现非交互式数据同步,这个文件名也需要修改权限为600

--delete:删除那些仅在目标路径中存在的文件(源路径中不存在),在脚本中的数据同步经常加上此参数

--list-only:仅列出服务器模块列表,需要rsync服务器设置list=true

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐