¿Cómo puedo instalar correctamente múltiples ecosistemas Distribute / virtualenv / pip que no son paquetes en Ubuntu?

Estoy desarrollando aplicaciones Python en Ubuntu. Quiero configurar un ecosistema Distribuir / virtualenv / pip para administrar mis paquetes de Python independientemente de cualquier paquete de sistema de Python (que administro en Synaptic, o más bien dejo que el sistema los administre por mí).

Podría instalar las herramientas python-setuptools, python-virtualenv y python-pip y estar en mi camino alegre, pero también quiero poder obtener las versiones más recientes / específicas de Distribute, virtualenv y pip. No hay PPA para estos, así que tendré que instalarlos manualmente.

Una complicación final, es que quiero poder hacer esto para varias versiones de Python. Es decir, configure un ecosistema para python2.6, otro para python, otro para python3, o en un sistema de 64 bits otro para python de 32 bits chrooteado .

Supongo que el proceso sería algo como:

  • Usando Python X instale mi propia copia de Distribuir en una ubicación en mi carpeta de inicio
  • Usando indie Distribute, easy_install pip
  • Usando indie pip, instala virtualenv
  • Usando indie virtualenv, crea un entorno virtual
  • Activar entorno virtual, instalar paquetes.
  • Repita para Python Y, Z y Q

¿Qué opciones de instalación / configuración estoy buscando?

Basado en la respuesta de Walker Hale IV a una pregunta similar (pero distinta!;), Hay dos claves para hacer esto:

  • no es necesario instalar Distribuir y PIP porque se incluyen automáticamente en un nuevo entorno virtual (y presumiblemente solo desea las versiones que se han probado con virtualenv)
  • puede usar el código fuente de virtualenv para crear un nuevo entorno virtual, en lugar de usar la versión instalada de sistema de virtualenv

Así que el flujo de trabajo es:

  • instala la versión X de Python en tu sistema
  • descargue el código fuente de virtualenv versión Q (probablemente la última)
  • Crea un nuevo entorno virtual con Python X y virtualenv Q
  • su nuevo VE ahora está ejecutando Python X y las últimas versiones estables de pip y distribuir
  • pip instalar cualquier otro paquete
  • easy_install cualquier otro paquete que no puedas instalar

Notas:

  • En su nuevo entorno virtual, podría instalar versiones nuevas (o antiguas) de distribuir, pip o virtualenv. (Yo creo que)
  • No utilizo la técnica de WH4 para crear un entorno virtual bootstrap. En su lugar, creo el nuevo entorno virtual de la fuente virtualenv cada vez.
  • Esta técnica debe ser utilizable en cualquier sistema operativo.
  • Si le explicara esto a alguien nuevo en todo el concepto del ecosistema Distribuir / pip / virtualenv, lo explicaría de una manera virtualmente centrada.

He escrito un script de bash que hace lo básico en Ubuntu:

#! /bin/bash # Script to create a python virtual environment # independently of the system version of virtualenv # # Ideally this would be a cross-platform Python # script with more validation and fewer TODOs, # but you know how it is. # = PARAMETERS = # $1 is the python executable to use # examples: python, python2.6, /path/to/python # $2 is the new environment folder # example: /path/to/env_folder/name ## TODO: should be just a name ## but I can't concatenate strings in bash # $3 is a pip requirements file # example: /path/to/req_folder/name.txt # you must uncomment the relevant code below to use $3 ## TODO: should be just a name ## but I can't concatenate strings in bash # other parameters are hard-coded below # and you must change them before first use # = EXAMPLES OF USE = # . env_create python2.5 /home/env/legacy ## creates environment "legacy" using python 2.5 # . env_create python /home/env/default ## creates environment "default" using whatever version of python is installed # . env_create python3.2 /home/env/bleeding /home/req/testing.txt ## creates environment "bleeding" using python 3.2 and installs packages from testing.txt using pip # = SET UP VARIABLES = # Required version of virtualenv package VERSION=1.6.4 # Folder to store your virtual environments VE_FOLDER='/media/work/environments' ## TODO: not used because I can't concatenate strings in bash # Folder to store bootstrap (source) versions of virtualenv BOOTSTRAP_FOLDER='/media/work/environments/bootstrap' ## TODO: not used because I can't concatenate strings in bash # Folder to store pip requirements files REQUIREMENTS_FOLDER='/media/work/environments/requirements' ## TODO: not used because I can't concatenate strings in bash # Base URL for downloading virtualenv source URL_BASE=http://pypi.python.org/packages/source/v/virtualenv # Universal environment options ENV_OPTS='--no-site-packages --distribute' # $1 is the python interpreter PYTHON=$1 # $2 is the target folder of the new virtual environment VE_TARGET=$2 # $3 is the pip requirements file REQ_TARGET=$3 ## = DOWNLOAD VIRTUALENV SOURCE = ## I work offline so I already have this downloaded ## and I leave this bit commented out # cd $BOOTSTRAP_DIR # curl -O $URL_BASE/virtualenv-$VERSION.tar.gz ## or use wget # = CREATE NEW ENV USING VIRTUALENV SOURCE = cd $BOOTSTRAP_FOLDER tar xzf virtualenv-$VERSION.tar.gz # Create the environment $PYTHON virtualenv-$VERSION/virtualenv.py $ENV_OPTS $VE_TARGET # Don't need extracted version anymore rm -rf virtualenv-$VERSION # Activate new environment cd $VE_TARGET . bin/activate # = INSTALL A PIP REQUIREMENTS FILE = ## uncomment this if you want to automatically install a file # pip install -r $REQ_TARGET # = REPORT ON THE NEW ENVIRONMENT = python --version pip freeze # deactivate ## uncomment this if you don't want to start in your environment immediately 

La salida se ve algo así (con la descarga desactivada y la desactivación activada):

 usuario @ computadora: / inicio / usuario $.  env_create python3 / media / work / environment / test
 Nuevo ejecutable de python en / media / work / environment / test / bin / python3
 También creando ejecutables en / media / work / environment / test / bin / python
 Instalación de distribuir ............... hecho.
 Instalación de pip ............... hecho.
 Python 3.2
 distribuir == 0.6.19
 wsgiref == 0.1.2
 usuario @ computadora: / media / trabajo / ambientes / prueba $ 

Como lo señaló @jfsebastian, virtualenvwrapper hace mucho o todo lo que estás pidiendo.

http://virtualenvwrapper.readthedocs.org/

virtualenvwrapper es un conjunto de extensiones para la herramienta virtualenv de Ian Bicking. Las extensiones incluyen envoltorios para crear y eliminar entornos virtuales y, de lo contrario, administrar el flujo de trabajo de desarrollo, lo que facilita el trabajo en más de un proyecto a la vez sin introducir conflictos en sus dependencias.

Como parte de las contribuciones de JF Sebastian y nealmcb, en estos días sí que uso la versión de virtualenvwrapper en mi sistema (disponible en Ubuntu 12.04 y versiones posteriores).

virtualenvwrapper es un conjunto de extensiones para la herramienta virtualenv de Ian Bicking. Las extensiones incluyen envoltorios para crear y eliminar entornos virtuales y, de lo contrario, administrar el flujo de trabajo de desarrollo, lo que facilita el trabajo en más de un proyecto a la vez sin introducir conflictos en sus dependencias.

Las características clave que uso (en respuesta a esta pregunta) son:

  • mkvirtualenv --python=PYTHON_EXE crea un virtualenv usando un ejecutable de Python específico (no tiene que ser una versión empaquetada del sistema)
  • unirse al soporte virtualenv de pip
  • allvirtualenv pip install -U pip actualiza pip en todos los virtualenvs

Las variables de entorno que mencionó JFS son realmente útiles para jugar con: PIP_DOWNLOAD_CACHE, VIRTUALENV_USE_DISTRIBUTE, WORKON_HOME, VIRTUALENVWRAPPER_PYTHON.

La única razón para actualizar virtualenv es obtener la última versión de setuptools (anteriormente conocido como Distribute, anteriormente conocido como setuptools). No he tenido la necesidad de hacer esto todavía, pero sospecho que sería más fácil comenzar con un virtualenv nuevo y actualizar Distribute / setuptools primero, luego actualizar pip, luego instalar otras bibliotecas.

Si una nueva versión de virtualenv es estrictamente necesaria, una modificación de la secuencia de comandos de arranque debería hacer.