迁移Python2.7 virtualenv至无Python2.7服务器后无法正常工作
问题根源与解决方案
你碰到的这个问题其实是virtualenv的核心机制导致的——虚拟环境并不是把Python解释器完全打包带走的,它本质上是创建了一套指向你原开发环境Python2.7的链接,再搭配独立的包管理目录而已。
具体原因拆解
- 当你用
virtualenv -p python2.7 ums_env创建环境时,这个环境里的bin/python其实是个软链接,指向你开发机器上Python2.7的实际安装路径(比如可能是/usr/local/bin/python2.7)。 - 把文件夹复制到只有Python2.6的服务器后,服务器上根本没有这个路径下的Python2.7,虚拟环境启动后找不到对应的解释器,自然就跑不起来。
- 除此之外,虚拟环境里的
activate、pip这类脚本,也硬编码了原开发环境的Python路径,这也会导致执行时出错。
可行的解决办法
1. 在目标服务器重新创建虚拟环境(推荐)
这是最稳妥的方式,步骤如下:
# 先确保服务器上安装了Python2.7(没有的话可以用yum/apt-get或者源码编译安装) virtualenv -p python2.7 ums_env # 把你原项目的代码(注意不要带原虚拟环境的包目录)复制过来 . ums_env/bin/activate # 重新安装项目依赖 pip install -r requirements.txt
这样创建的虚拟环境会适配服务器上的Python2.7路径,完全不会有路径匹配的问题。
2. 手动修改虚拟环境的路径配置(应急用,不推荐)
如果实在不想重新创建,可以尝试修改几个关键文件:
- 打开
ums_env/bin/activate,修改里面VIRTUAL_ENV和PATH相关的路径,替换成服务器上Python2.7的路径。 - 把
ums_env/bin/python替换成服务器上Python2.7的硬链接,或者直接复制Python2.7的执行文件过来。 - 修改
ums_env/lib/python2.7/site-packages下的easy-install.pth等配置文件里的原路径。
不过这种方法很容易遗漏配置,后续可能出现各种奇怪的依赖报错,只建议临时应急使用。
额外提醒
virtualenv本身就不支持跨不同Python环境的机器移植。如果你需要可移植的虚拟环境,可以试试virtualenv --relocatable命令尝试让环境变成可重定位的,但这个命令有不少限制——比如没法处理带绝对路径的C扩展包,所以还是在目标环境重新创建最靠谱。
内容的提问来源于stack exchange,提问作者放課後
相关产品推荐
相关产品推荐

