Pip, Fabric y Virtualenv, herramientas para el desarrollo Python

Pip, Fabric y Virtualenv son tres herramientas extremadamente útiles y favorables para el desarrollo con Python. Estas permiten automatizar el proceso de instalación de dependencias y despliegue de proyectos en un ambiente aislado tanto para producción como para pruebas funcionales durante el desarrollo.

Pip

Pip es una herramienta de línea de comandos desarrollada para mejorar el comportamiento del easy_install de distutils y solventar sus carencias. Entre sus principales características están:

  • Búsqueda de paquetes en PyPi.
  • Instalación y desinstalación de paquetes.
  • Instalación de paquetes desde sus sistemas de control de versiones (añade Git, Mercurial y Bazaar a los soportados por easy_install)
  • Puede tomar un listado de paquetes como argumento en batch desde un fichero.
  • Puede tomar un Virtualenv como argumento e instalar y desinstalar directamente en el ambiente virtual.
  • Creación de bundles, archivos comprimidos que contienen un conjunto de paquetes.

Como abreboca:

$ pip --help
Usage: pip COMMAND [OPTIONS]

Options:
  --version             show program's version number and exit
  -h, --help            Show help
  -E DIR, --environment=DIR
                        virtualenv environment to run pip in (either give the
                        interpreter or the environment base directory)
  -s, --enable-site-packages
                        Include site-packages in virtualenv if one is to be
                        created. Ignored if --environment is not used or the
                        virtualenv already exists.
  -v, --verbose         Give more output
  -q, --quiet           Give less output
  --log=FILENAME        Log file where a complete (maximum verbosity) record
                        will be kept
  --proxy=PROXY         Specify a proxy in the form
                        user:passwd@proxy.server:port. Note that the
                        user:password@ is optional and required only if you
                        are behind an authenticated proxy.  If you provide
                        user@proxy.server:port then you will be prompted for a
                        password.
  --timeout=SECONDS, --default-timeout=SECONDS
                        Set the socket timeout (default 15 seconds)

Commands available:
  bundle: Create pybundles (archives containing multiple packages)
  freeze: Output all currently installed packages (exact versions) to stdout
  help: Show available commands
  install: Install packages
  search: Search PyPI
  uninstall: Uninstall packages
  unzip: Unzip individual packages
  zip: Zip individual packages

Fabric

Fabric es un módulo Python que viene acompañado de la herramienta de línea de comandos fab, y provee un conjunto de métodos que potencian el despliegue de aplicaciones o proyectos entre varias máquinas usando SSH.

El centro del trabajo con Fabric es el fabfile, en el cual se definen acciones haciendo uso de métodos provistos por el módulo fabric, que permiten, entre otras cosas, cargar y descargar ficheros en un host remoto o ejecutar comandos en un shell local o remoto.

El Tutorial es un muy buen sitio para comenzar, pero mientras, el abreboca:

$ fab --help
Usage: fab [options] command[:arg1,arg2=val2,host=foo,hosts='h1;h2',...] ...

Options:
  -h, --help            show this help message and exit
  -V, --version         show program's version number and exit
  -l, --list            print list of possible commands and exit
  -d COMMAND, --display=COMMAND
                        print detailed info about a given command and exit
  -r, --reject-unknown-hosts
                        reject unknown hosts
  -D, --disable-known-hosts
                        do not load user known_hosts file
  -u USER, --user=USER  username to use when connecting to remote hosts
  -p PASSWORD, --password=PASSWORD
                        password for use with authentication and/or sudo
  -H HOSTS, --hosts=HOSTS
                        comma-separated list of hosts to operate on
  -R ROLES, --roles=ROLES
                        comma-separated list of roles to operate on
  -i KEY_FILENAME       path to SSH private key file. May be repeated.
  -a, --no_agent        don't use the running SSH agent
  -k, --no-keys         don't load private key files from ~/.ssh/
  -f FABFILE, --fabfile=FABFILE
                        Python module file to import, e.g. '../other.py'
  -w, --warn-only       warn, instead of abort, when commands fail
  -s SHELL, --shell=SHELL
                        specify a new shell, defaults to '/bin/bash -l -c'
  -c RCFILE, --config=RCFILE
                        specify location of config file to use
  --hide=LEVELS         comma-separated list of output levels to hide
  --show=LEVELS         comma-separated list of output levels to show

Virtualenv

Virtualenv es una herramienta esencial, léase ESENCIAL, para el desarrollo en Python, que nos permite crear ambientes aislados para la ejecución de nuestro código.

Comúnmente nos encontramos con que las máquinas usadas para el desarrollo terminan infestadas de dependencias usadas para pruebas de concepto, proyectos o experimentos, y cuándo nos damos cuenta es casi imposible limpiar el sistema y terminamos rompiendo otros paquetes que entran en conflicto con las versiones que hemos instalado.

Es importante declarar como pecado mortal la instalación de dependencias específicas a un proyecto en /usr/lib/pythonX.X/site-packages/, en cambio, se recomienda utilizar un entorno virtual dedicado para el mismo, y ahí es donde entra en juego Virtualenv.

Supongamos que vamos a comenzar un nuevo proyecto foo, los pasos a seguir serían, más o menos, los siguientes:

$ mkdir -p foo/{env,src}
$ cd foo/
$ virtualenv --distribute env/
$ source env/bin/activate
(env) $ pip -E env/ install dependencia1 dependencia2 dependencia3
(env) $ cd src/
(env) $ $EDITOR main.py

Esto nos deja con un entorno dentro de foo/env/ con las dependencias específicas del proyecto, el cual activamos con source env/bin/activate. Al activar el entorno la variable de entorno del shell PYTHONPATH (o sys.path en el prompt de Python) es actualizada para contener el directorio env/lib/pythonX.X/site-packages donde se instalarán los módulos con pip -E env/ install ...

Para más, visite la página principal de Virtualenv, por lo pronto:

$ virtualenv -h
Usage: virtualenv [OPTIONS] DEST_DIR

Options:
  --version             show program's version number and exit
  -h, --help            show this help message and exit
  -v, --verbose         Increase verbosity
  -q, --quiet           Decrease verbosity
  -p PYTHON_EXE, --python=PYTHON_EXE
                        The Python interpreter to use, e.g.,
                        --python=python2.5 will use the python2.5 interpreter
                        to create the new environment.  The default is the
                        interpreter that virtualenv was installed with
                        (/usr/bin/python2.6)
  --clear               Clear out the non-root install and start from scratch
  --no-site-packages    Don't give access to the global site-packages dir to
                        the virtual environment
  --unzip-setuptools    Unzip Setuptools or Distribute when installing it
  --relocatable         Make an EXISTING virtualenv environment relocatable.
                        This fixes up scripts and makes all .pth files
                        relative
  --distribute          Use Distribute instead of Setuptools. Set environ
                        variableVIRTUALENV_USE_DISTRIBUTE to make it the
                        default