Sur mon système, j'ai plusieurs modules installés plusieurs fois. Pour donner un exemple, numpy 1.6.1
est installé dans le chemin d'accès standard à /usr/lib/python2.7/dist-packages
, et j'ai une version mise à jour de numpy 1.8.0
installé à /local/python/lib/python2.7/site-packages/
.
La raison pour laquelle je ne peux pas simplement supprimer l'ancienne version est que je n'ai pas l'autorisation de modifier quoi que ce soit sur mon ordinateur de travail. J'ai cependant besoin d'utiliser la nouvelle version numpy.
J'ai ajouté /local/python/lib/python2.7/site-packages/
à mon PYTHONPATH
. Malheureusement, cela n'aide pas, car /usr/lib/python2.7/dist-packages
est inséré en premier dans le chemin et donc, numpy 1.6.1
sera chargé. Voici un exemple:
>>> 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',
...]
Il semble donc que l'ordre d'importation soit
PYTHONPATH
~/.local/lib/python2.7/site-packages/*.Egg
)~/usr/lib/python2.7/dist-packages/
)PYTHONPATH
~/.local/lib/python2.7/site-packages/
)Mon problème est que je devrais mettre l'article 5. avant les articles 3. et 4. pour que mon code fonctionne correctement. En ce moment, si j'importe un module qui a été compilé avec numpy 1.8.0
du /local/*
, et ce module importe numpy, il prendra toujours numpy du /usr/*
répertoire et échouer.
J'ai contourné ce problème en plaçant quelque chose comme ça dans mes scripts:
import sys
sys.path.insert(0, '/local/python/lib/python2.7/site-packages/')
Ainsi, je peux forcer Python à utiliser le bon ordre d'importation, mais bien sûr ce n'est pas une solution, car je devrais le faire dans chaque script unique.
Outre les suggestions déjà données dans la section des commentaires, avez-vous pensé à utiliser virtualenv ? Cela vous donnerait un contrôle précis sur chaque module que vous souhaitez utiliser. Si vous n'êtes pas familier avec virtualenv, vous voudrez lire la documentation pour avoir une idée de son fonctionnement.
Par exemple, vous pouvez l'installer et le configurer, comme ceci (virtualenv-1.11.6 ressemble pour être la version la plus récente actuellement):
$ curl -O https://pypi.python.org/packages/source/v/virtualenv/virtualenv-1.11.6.tar.gz
$ tar xvfz virtualenv-1.11.6.tar.gz
$ cd virtualenv-1.11.6
$ python virtualenv.py ../numpyvenv
$ cd ../numpyvenv
$ source ./bin/activate
(numpyvenv) $ pip install numpy
# downloads, compiles, and installs numpy into the virtual environemnt
(numpyvenv) $ python
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>> numpy.version.version
'1.9.1'
>>> quit()
(numpyvenv) $ deactivate
$ # the virtual environment has been deactivated
Ci-dessus, nous avons créé un environnement virtuel nommé "numpyvenv", activé l'environnement, installé numpy, imprimé la version numpy (pour montrer que cela fonctionne), quitté python et désactivé l'environnement. La prochaine fois que vous activerez l'environnement, numpy sera là avec tous les autres modules que vous installerez. Vous pouvez rencontrer des hoquets en essayant cela, mais cela devrait vous aider à démarrer.
J'ai eu ce problème sur un Mac que j'utilisais sans accès administrateur. Ma solution était la suivante:
Recherchez le répertoire de la version numpy que vous souhaitez utiliser. Pour moi, c'était /Library/Python/2.7/site-packages
Créez un fichier ~/.startup.py
Et pointez-le avec PYTHONSTARTUP=~/.startup.py
Dans votre fichier .bashrc
Dans .startup.py
:
import sys
sys.path.insert(0,'/Library/Python/2.7/site-packages/')
<--- importe ceci AVANT les pièces standard
import numpy
print("Importing numpy version"+numpy.__version__)
<---- Pour rappeler que nous avons changé la version numpy
Cela semble bien fonctionner pour moi. J'espère que ça aide.
Alors qu'un virtualenv semble être la voie à suivre, à partir de Force python pour utiliser une version plus ancienne du module (que ce que j'ai installé maintenant) vous pouvez également utiliser une modification de
import pkg_resources pkg_resources.require("Twisted==8.2.0") import twisted
J'ai eu le même problème sur Debian Wheezy après avoir installé le dernier module numpy avec easy_install.
Le nouveau module numpy a été installé dans /usr/local/lib/python2.7/dist-packages/numpy
alors que l'ancien module était dans /usr/lib/pymodules/python2.7/numpy
. Lorsque j'ai essayé d'importer le module numpy, l'ancienne version a été importée. Et comme vous le dites, l'ajout à PYTHONPATH
du nouveau chemin de module n'aide pas, car il est ajouté dans le sys.path
sous l'ancienne entrée.
Le problème semble être dans easy-install
, car il crée un fichier easy-install.pth
qui importe /usr/lib/pymodules/python2.7 avant tout module local.
Pour résoudre le problème Je viens d'éditer d'éditer le fichier /usr/local/lib/python2.7/dist-packages/easy-install.pth
et commentaire édité la ligne /usr/lib/pymodules/python2.7
donc cette ligne sera placée en dessous dans le sys.path.