服务器升级后如何复刻失效的旧Python环境?
提取失效Python旧环境包信息的解决方案
1. 直接读取site-packages目录的元信息
旧虚拟环境的所有安装包都会在{你的虚拟环境路径}/lib/python2.7/site-packages下生成*.dist-info或*.egg-info文件夹,这些文件夹名称本身就包含包名和版本号。执行以下命令即可提取:
# 处理dist-info格式 ls /path/to/old/venv/lib/python2.7/site-packages/*.dist-info | awk -F'/' '{split($NF, arr, "-"); ver=arr[length(arr)]; sub(/\.dist-info$/, "", ver); name=""; for(i=1; i<length(arr); i++) name=name arr[i] (i<length(arr)-1 ? "-" : ""); print name "==" ver}' # 处理egg-info格式(如果存在) ls /path/to/old/venv/lib/python2.7/site-packages/*.egg-info | awk -F'/' '{split($NF, arr, "-"); ver=arr[length(arr)]; sub(/\.egg-info$/, "", ver); name=""; for(i=1; i<length(arr); i++) name=name arr[i] (i<length(arr)-1 ? "-" : ""); print name "==" ver}'
将命令输出重定向到requirements.txt,就能得到完整的包版本列表。
2. 修复libpython2.7.so.1.0缺失后运行pip freeze
既然服务器已安装Python 2.7,先定位缺失的库文件:
# 查找系统中是否存在该库 find / -name "libpython2.7.so.1.0" 2>/dev/null
如果找到路径(比如/usr/local/lib/libpython2.7.so.1.0),临时指定库搜索路径后运行旧环境的pip:
LD_LIBRARY_PATH=/usr/local/lib /path/to/old/venv/bin/pip freeze > requirements.txt
如果系统中完全没有这个文件,说明Python 2.7安装不完整,重新编译安装时需启用共享库:
# 下载Python 2.7源码后执行 ./configure --enable-shared make && make install
3. 排查安装日志或pip缓存
- 检查旧虚拟环境根目录下是否有
pip-install.log之类的安装记录文件,里面会包含安装的包和版本; - 查看用户目录下的pip缓存
~/.cache/pip,缓存文件夹名称会包含包名和版本,但需要手动筛选对应环境的内容。
内容的提问来源于stack exchange,提问作者kloop
相关产品推荐
相关产品推荐

