Python: selecione uma das várias versões de módulo instaladas
No meu sistema, tenho vários módulos instalados várias vezes. Para dar um exemplo,numpy 1.6.1
está instalado no caminho padrão em/usr/lib/python2.7/dist-packages
e eu tenho uma versão atualizada donumpy 1.8.0
instalado em/local/python/lib/python2.7/site-packages/
.
O motivo pelo qual não posso simplesmente remover a versão antiga é que não tenho permissões para alterar nada no meu computador de trabalho. No entanto, eu preciso usar a nova versão numpy.
Eu adicionei/local/python/lib/python2.7/site-packages/
para o meuPYTHONPATH
. Infelizmente, isso não ajuda, pois/usr/lib/python2.7/dist-packages
é inserido no caminho primeiro e, portanto,numpy 1.6.1
será carregado. Aqui está um exemplo:
>>> import os
>>> print os.environ['PYTHONPATH']
/local/python/lib/python2.7/site-packages
>>> import pprint
>>> import sys
>>> pprint.pprint(sys.path)
['',
'/local/python/lib/python2.7/site-packages/matplotlib-1.3.1-py2.7-linux-x86_64.egg',
'/local/python/lib/python2.7/site-packages/pyparsing-2.0.1-py2.7.egg',
'~/.local/lib/python2.7/site-packages/setuptools-3.4.4-py2.7.egg',
'~/.local/lib/python2.7/site-packages/mpldatacursor-0.5_dev-py2.7.egg',
'/usr/lib/python2.7/dist-packages',
'/local/python/lib/python2.7/site-packages',
'/usr/lib/python2.7',
...,
'~/.local/lib/python2.7/dist-packages',
...]
Portanto, parece que a ordem de importação é
diretório atualovos dePYTHONPATH
ovos do caminho do módulo local (~/.local/lib/python2.7/site-packages/*.egg
)caminho do módulo em todo o sistema (~/usr/lib/python2.7/dist-packages/
)diretórios dePYTHONPATH
caminhos intermediários (omitidos por questões de brevidade)diretório userbase (~/.local/lib/python2.7/site-packages/
)Meu problema é que eu precisaria colocar o item 5. antes dos itens 3. e 4. para que meu código funcionasse corretamente. No momento, se eu importar um módulo que foi compiladonumpy 1.8.0
de/local/*
diretório, e este módulo importa numpy, ele ainda será usado no diretório/usr/*
diretório e falhar.
Eu contornei esse problema colocando algo assim nos meus scripts:
import sys
sys.path.insert(0, '/local/python/lib/python2.7/site-packages/')
Dessa forma, posso forçar o Python a usar a ordem de importação correta, mas é claro que isso não é uma solução, pois eu precisaria fazer isso emtodo script.