Python: seleccione una de las múltiples versiones de módulos instalados

En mi sistema, tengo varios módulos instalados varias veces. Para dar un ejemplo, numpy 1.6.1 se instala en la ruta estándar en /usr/lib/python2.7/dist-packages , y tengo una versión actualizada de numpy 1.8.0 instalada en /local/python/lib/python2.7/site-packages/ .

La razón por la que no puedo simplemente eliminar la versión anterior es que no tengo permisos para cambiar nada en la computadora de mi trabajo. Sin embargo necesito usar la nueva versión numpy.

He agregado /local/python/lib/python2.7/site-packages/ a mi PYTHONPATH . Desafortunadamente, esto no ayuda, ya que /usr/lib/python2.7/dist-packages se inserta primero en la ruta y, por lo tanto, se numpy 1.6.1 . Aquí hay un ejemplo:

 >>> 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', ...] 

Por lo tanto, parece que el orden de importación es

  1. directorio actual
  2. huevos de PYTHONPATH
  3. huevos de la ruta del módulo local ( ~/.local/lib/python2.7/site-packages/*.egg )
  4. ruta del módulo de todo el sistema ( ~/usr/lib/python2.7/dist-packages/ )
  5. directorios de PYTHONPATH
  6. Caminos intermedios (omitidos por brevedad)
  7. Directorio de base de usuarios ( ~/.local/lib/python2.7/site-packages/ )

Mi problema es que necesitaría poner el artículo 5. antes de los artículos 3. y 4. para que mi código funcione correctamente. En este momento, si importo un módulo que fue comstackdo contra numpy 1.8.0 desde el directorio /local/* , y este módulo importa numpy, todavía tomará numpy del directorio /usr/* y fallará.

    He evitado este problema colocando algo como esto en mis scripts:

     import sys sys.path.insert(0, '/local/python/lib/python2.7/site-packages/') 

    Por lo tanto, puedo forzar a Python a usar el orden de importación correcto, pero por supuesto esto no es una solución, ya que tendría que hacer esto en cada script individual .

    Además de las sugerencias ya dadas en la sección de comentarios, ¿has pensado en usar virtualenv ? Esto le daría un control detallado sobre cada módulo que desee utilizar. Si no está familiarizado con virtualenv, querrá leer la documentación para tener una idea de cómo funciona.

    Simplemente, por ejemplo, puedes instalarlo y configurarlo, así (virtualenv-1.11.6 parece ser la versión más reciente actualmente):

     $ 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 

    Anteriormente, creamos un entorno virtual llamado “numpyvenv”, activamos el entorno, instalamos numpy, imprimimos la versión numpy (para mostrar que funciona), salimos de python y desactivamos el entorno. La próxima vez que active el entorno, numpy estará allí junto con cualquier otro módulo que instale. Puede que tenga problemas al intentar esto, pero debería comenzar.

    Tuve este problema en una Mac que estaba usando sin acceso de administrador. Mi solución fue la siguiente:

    1. Encuentra el directorio de la versión numpy que quieres usar. Para mí esto fue /Library/Python/2.7/site-packages

    2. Cree un archivo ~/.startup.py y ~/.startup.py con PYTHONSTARTUP=~/.startup.py en su archivo .bashrc

    3. En .startup.py :

    import sys

    sys.path.insert(0,'/Library/Python/2.7/site-packages/') <--- importa esto ANTES de las partes estándar

    import numpy

    print("Importing numpy version"+numpy.__version__) <---- Para recordar que hemos cambiado la versión numpy

    Esto parece funcionar bien para mí. Espero que ayude.

    Tuve el mismo problema en Debian Wheezy después de instalar el último módulo numpy con easy_install.

    El nuevo módulo numpy se instaló en /usr/local/lib/python2.7/dist-packages/numpy mientras que el módulo anterior estaba en /usr/lib/pymodules/python2.7/numpy . Cuando intenté importar el módulo numpy, se importó la versión anterior. Y como usted dice, agregar a PYTHONPATH la nueva ruta del módulo no ayuda, porque se agrega en sys.path debajo de la entrada anterior.

    El problema parece estar en easy-install , porque crea un archivo easy-install.pth que importa /usr/lib/pymodules/python2.7 antes de cualquier módulo local.

    Para solucionar el problema , simplemente edité el archivo /usr/local/lib/python2.7/dist-packages/easy-install.pth y /usr/local/lib/python2.7/dist-packages/easy-install.pth la línea /usr/lib/pymodules/python2.7 por lo que esta línea colocarse debajo en el sys.path.

    Si bien un virtualenv parece ser el camino a seguir, como Force Python para usar una versión anterior del módulo (que la que tengo instalada ahora) , también puede usar una modificación de

     import pkg_resources pkg_resources.require("Twisted==8.2.0") import twisted