web-dev-qa-db-fra.com

Python: sélectionnez l'une des multiples versions de module installées

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

  1. répertoire actuel
  2. oeufs de PYTHONPATH
  3. oeufs du chemin du module local (~/.local/lib/python2.7/site-packages/*.Egg)
  4. chemin du module à l'échelle du système (~/usr/lib/python2.7/dist-packages/)
  5. répertoires de PYTHONPATH
  6. chemins intermédiaires (omis par souci de concision)
  7. répertoire de la base utilisateur (~/.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.

27
Jenny

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.

8
rkersh

J'ai eu ce problème sur un Mac que j'utilisais sans accès administrateur. Ma solution était la suivante:

  1. Recherchez le répertoire de la version numpy que vous souhaitez utiliser. Pour moi, c'était /Library/Python/2.7/site-packages

  2. Créez un fichier ~/.startup.py Et pointez-le avec PYTHONSTARTUP=~/.startup.py Dans votre fichier .bashrc

  3. 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.

3
Nick Walkden

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
2
serv-inc

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.

1
Pedro Piter