在OS python升级之后,virtualenv python在简单任务中出现“未定义的符号:_PyLong_AsInt”错误

时间:2014-08-04 16:36:24

标签: python python-2.7 virtualenv

我有一个基于python-2.7.3的长期工作virtualenv。接受推荐的平台操作系统(Ubuntu)更新(其中包括许多其他更改)使python达到2.7.6之后,virtualenv中的python开始出错,基本上所有非平凡的任务,堆栈结束如下:

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

即使pip freeze失败也会出现这样的错误 - 甚至无法在破碎的virtualenv中获得已安装软件包的准确库存(可能会重新安装到新的工作版本中)!

不应该保护virtualenv免受这种外部升级?或者至少在2.7.x系列中?

2 个答案:

答案 0 :(得分:13)

你可以简单地做

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

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

答案 1 :(得分:2)

virtualenv引用了外部安装 - 在这种情况下,myvenv/lib/python2.7/lib-dynload路径实际上是/usr/lib/python2.7/lib-dynload的软链接,已经更新。那么回滚到2.7.3可能有用吗?

尝试从python.org下载2.7.3源代码,并使用通常的咒语构建/安装(甚至意识到这是破坏系统首选的python,我可以采用全系统VM快照的风险< / em>的):

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

仍然没有运气:同样的错误,即使软链接现在指向基于2.7.3的资源。但是如何将系统/usr/bin/python-2.7复制到virtualenv? (我对不同的版本不太喜欢,但在这一点上,为什么不呢?)

解决了这个问题。 virtualenv现在正在工作,至少允许一些测试和提取“pip冻结”库存。当然,依赖于2.7.6的外部东西现在可能会被打破。

并且可能已经足够,而且安全,只需将系统2.7.6 python可执行文件拖入virtualenv即可替换其损坏的版本。 (不知道 - 其他答案/资源意味着在virtualenv中升级python时出现问题,除非之后重新安装所有软件包,尽管它们主要针对2.5 - > 2.6等非点修订。)