使用virtualenv和virtualenvwrapper管理python虚拟环境时,在不同系统环境的服务器上进行迁移。

环境

拥有1个管理节点和4个计算节点;每个节点拥有各自的固态盘安装系统,计算节点的Python安装在系统盘上;4个计算节点通过NFS挂载管理节点的机械硬盘作为/home。

计算节点分别是gpu01-04,其中gpu01-02安装python时并没有指定安装路径,包默认安装在了/usr/lib64/python3.6中;而在gpu03-04中,编译时指定了prefix,也就是指定了安装路径,路径为/usr/local/python3,这时包就会安装在/usr/local/python3/lib下。

问题

由于4个计算节点的/home是一样的,所以无论登录哪个节点,用户的虚拟环境目录均是相同的。
在gpu01-02上可以正常使用虚拟环境;
在gpu03-04上可以通过workon切换至虚拟环境,但是import时,会提示 No module named **
通过sys.path查看import的搜索路径,并没有发现虚拟环境对应的site-packages

原因

可以在virtualenv虚拟环境目录(env/lib/python3.6)里看到,基础的一些包是通过软连接链接到系统目录下的包的。
virtualenv虚拟环境迁移
我的虚拟环境是在gpu01-02创建的,这些软连接在gpu03-04上就找不到对应的文件了,因此会出现上述的问题。

解决

1、重新安装python,保持每个节点一致。不过我比较喜欢指定安装路径,这样要容易管理。
2、在gpu03-04上创建软连接,我这里是在/usr/lib64 下创建软连接python3.6到我安装python的目录的lib文件夹
也就是/usr/lib64/python3.6 -> /usr/local/python3/lib/python3.6,这样做虚拟环境目录下的包就能够链接到正确的文件了。
virtualenv虚拟环境迁移

相关文章: