我有一个基于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系列中?
答案 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等非点修订。)