操作系统Python升级后,virtualenv在简单任务中出现“未定义符号: _PyLong_AsInt”错误

12 投票
2 回答
5644 浏览
提问于 2025-04-18 15:57

我之前一直在用一个基于python-2.7.3的虚拟环境,运行得很好。可是,最近我接受了推荐的操作系统更新(是Ubuntu),这次更新把python升级到了2.7.6。结果,虚拟环境里的python开始在几乎所有稍微复杂一点的任务上出错,错误信息的最后一部分是这样的:

ImportError: /home/myusername/ENVS/myvenv/lib/python2.7/lib-dynload/_io.so: undefined symbol: _PyLong_AsInt

就连 pip freeze 这个命令也出错了,这让我们根本无法准确查看在这个坏掉的虚拟环境中安装了哪些包(这样我也就无法把它们重新安装到一个新的正常的虚拟环境里)!

难道虚拟环境不应该受到外部升级的影响吗?或者至少应该保持在2.7.x这个系列里吗?

2 个回答

2

这个虚拟环境(virtualenv)指向了外部安装的Python版本。在这个例子中,myvenv/lib/python2.7/lib-dynload这个路径实际上是一个软链接,指向/usr/lib/python2.7/lib-dynload,而这个路径已经被更新了。所以,可能回退到2.7.3版本会有效?

我尝试从python.org下载2.7.3的源代码,并用常规的方法构建和安装(我知道这样会覆盖系统默认的Python,这是我在做全系统虚拟机快照时可以冒的风险):

cd Python-2.7.3/
./configure 
make
sudo make install

结果还是不行:同样的错误,尽管软链接现在指向的是基于2.7.3的资源。那么,把系统的/usr/bin/python-2.7复制到虚拟环境里怎么样?(我之前不太愿意这样做,因为版本不同,但现在,为什么不呢?)

这样解决了问题。现在虚拟环境可以正常工作了,至少可以进行一些测试和提取“pip freeze”的清单。当然,依赖于2.7.6的外部东西可能会坏掉。

而且,可能只需把系统的2.7.6 Python可执行文件拉进虚拟环境,替换掉坏掉的版本就足够了,且是安全的。(我不太确定——其他答案和资源暗示在虚拟环境中升级Python会有问题,除非之后重新安装所有包,尽管他们主要讨论的是非小版本的升级,比如从2.5升级到2.6。)

13

你可以简单地这样做:

cp /usr/bin/python2 /path/to/my-virtualenv/bin/python2

或者这样:

cp /usr/bin/python3 /path/to/my-virtualenv/bin/python3

撰写回答