Solucionar problema de módulo no encontrado

Esto me ha vuelto a pasar hoy , tengo un módulo en desarollo y quiero importar el módulo fuera de un directorio donde tengo acceso directo al módulo. Pues una opción es instalar el módulo para que el interprete sepa que hay un módulo con ese nombre, y la otra es agregar la ruta desde la que se puede acceder a ese módulo en la lista de sys.path

import os
import sys
self_path = os.path.dirname(os.path.realpath(__file__))
sys.path.append("{}/../../".format(self_path))

Funciona bien bien

python requirements using git

En algunos proyectos actualmente estoy usando un repo de git como dependencia, ya sea por que es un repo privado o por que no está disponible en pypi.

Cómo se indica una dependencia en requirements.txt:

git+https://github.com/jsenin/pythondependency.git#egg=module
git+https://github.com/jsenin/pythondependency.git@<branch>#egg=module
git+https://github.com/jsenin/pythondependency.git@<commit_hash>#egg=module

Hay que tener en cuenta que si es una dependencia que vamos a editar tenemos que instalarla con ‘-e’

-e git+https://github.com/jsenin/pythondependency.git#egg=module

Para instalar las dependencias usamos pip

pip install -r requirements.txt

Otra forma de instalar estos paquetes es usando setup.py y dependencias. Bien, hay que tener en cuenta que usando el típico script setup.py que usa setuptools (distutils están obsoletas)  instala dependencias y tiene dos modos: python setup.py install y python setup.py develop. La diferencia es que install instala los paquetes sin que sean editables y con develop sí son editables. Además no se genera el wheell ( paquete de instalación ) cosa que con pip sí se hace, con lo que la desintalación es sencilla usando el propio pip. Por otro lado las setuptools generan directorios egg que habrá que borrar a mano si queremos desinstalar. 

Existe una opción de borrar los paquetes instalados con setuptools en modo develop

python setup.py develop --uninstall

entornos virtuales en python

Las aplicaciones cada vez son más complejas y por suerte más estructuradas, por ello los pequeños bloques de código reutilizable se extraen y se paquetizan, con uno u otro nombre dependiendo de cada lenguaje. El siguiente paso necesario es una herramienta que gestione los paquetes, instalar, listar, eliminar, instalar desde una fuente remota, etc… Bien pues aquí es donde llega la necesidad de usar un entorno virutal. ¿Por qué? Por varios motivos, uno es que cada aplicación puede requerir una serie de paquetes con versiones concretas que no son necesarias con otras aplicaciones o que incluso que sean incopatibles entre sí.
Usando un entorno virtual podemos instalar estas dependencias en una ruta exclusiva para nuestra aplicación y no tenemos que instalarlas en el sistema. Esto es genial ya que no necesitaremos permisos elevados para instalar los paquetes ni tendremos que andar instalando o desinstalando paquetes para poder desarrollar o instalar una aplicación. Además podemos deshacernos fácilmente de estos paquetes eliminando la ruta donde se almacenan y volver a instalarlos para probar el despliegue o simplemente por si sospechamos que hay ‘algo’ que no está correcto en nuestras dependencias.

En el caso de python hay dos entornos virtuales que se usan extensivamente: virtualenvwrapper y virtuaenv.

La primera vez que empecé a leer sobre esto me resultó muy confuso por que parecía que se hablaba de un sólo software para crear el entorno virutal y no de dos. El uso de estos dos nombres muy parecidos favorece la confusión, pero son dos proyectos que al fin y al cabo hacen lo mismo: proveernos de un entorno virtual.

A grandes rasgos las características principales de virtualenvwrapper vs virtualenv en Debian son:
* virtualenvwrapper sólo soporta python2.x ( ojo, en paquete Debian, ver READE.debian) y virutalenv soporta 2.x y 3.x
* virtualenvwrapper centraliza el almacenamiento de dependencias en $WORKON_HOME Y virutalenv no, debes especificar el directorio cada vez que creas el entorno.

Ahora, como comenzar a usar un entorno virtual en python:

Virtualenvwrapper


sudo apt-get install virtualenvwrapper
mkvirtualenv my_project
workon my_project
...
deactivate

Se crea por defecto en `~/.virtualenvs`

 Virtualenv

Puedes preparar el entorno para la version de python que quieras siempre que la tengas instalada en el systema ( -p <ruta_a_bin_python> )

sudo apt-get install python-virtualenv
virtualenv -p /usr/bin/python2 venv
source venv/bin/activate
...
deactivate

instalar dependencias: pip

El gestor de dependencias por defecto en python es pip, y con el puedes instalar, desintalar, instalar desde remoto, etc…
Con estos entornos ya puedes instalar tus ficheros requirements.txt o requirements-dev.txt de pip sin tener que usar poderes de supervaca. La manera ‘standard’ para instalar las dependencias de un proyecto:


pip install pip --upgrade
pip install -r acs/requirements-dev.txt --upgrade
pip install -r acs/requirements.txt --upgrade

Finalmente podrías configurar cada paquete que disponga de setup.py

for package in $(ls -d */); do pushd $package; if [ -e setup.py ]; then python setup.py develop; fi; popd; done