Além da biblioteca padrão e dos módulos de terceiros, o Python também possui módulos incorporados. Eles são escritos em C e são vinculados diretamente ao executável do Python. Você pode descobrir o que são assim:
$ python
Python 2.7.4 (default, Apr 19 2013, 18:28:01)
[GCC 4.7.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.builtin_module_names
('__builtin__', '__main__', '_ast', '_bisect', '_codecs', '_collections', '_functools', '_heapq', '_io', '_locale', '_md5', '_random', '_sha', '_sha256', '_sha512', '_socket', '_sre', '_struct', '_symtable', '_warnings', '_weakref', 'array', 'binascii', 'cPickle', 'cStringIO', 'cmath', 'errno', 'exceptions', 'fcntl', 'gc', 'grp', 'imp', 'itertools', 'marshal', 'math', 'operator', 'posix', 'pwd', 'select', 'signal', 'spwd', 'strop', 'sys', 'syslog', 'thread', 'time', 'unicodedata', 'xxsubtype', 'zipimport', 'zlib')
virtualenv env
funciona copiando /usr/bin/python2.7
para env/bin/python
e, em seguida, ligando simbolicamente todos os módulos da biblioteca padrão em env/lib/python2.7/*.py
.
Quando você atualiza seu sistema Python, você obtém automaticamente a biblioteca padrão atualizada em todos os seus virtualenvs (porque links simbólicos!), mas ainda está usando a cópia antiga do executável Python. Isso significa que você também está usando as versões antigas dos módulos incorporados.
Alguns módulos de biblioteca padrão dependem de módulos incorporados. E, às vezes, a biblioteca padrão do Python 2.7. (X + 1) depende dos módulos incorporados que foram introduzidos no Python 2.7. (X + 1) também. Usando um virtualenv antigo, você está na verdade tentando usar o Python 2.7.x com a biblioteca padrão do Python 2.7. (X + 1), e às vezes isso quebra.
Recriar o virtualenv é a solução correta.
(É provavelmente suficiente substituir os executáveis bin/python
e bin/python2.7
dentro do virtualenv, assumindo que nenhum novo arquivo stdlib apareceu no sistema atualizado Python.)