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