Python - crisconru/tips GitHub Wiki

Apuntes / notas o tips para Python

Entornos virtuales

Cuando usas Python en tu ordenador, por ejemplo, si estamos en la carpeta /home/manuel/Code y tienes un fichero Python llamado hola.py, para al ejecutarlo desde la consola se pone python3 hola.py. Esta instrucción lo que hace es buscar el programa Python 3 que posiblemente esté /usr/bin/python3, siendo python3 un enlace a una versión de Python 3 de tu sistema (python3.4, python3.5, python3.6...). Si por ejemplo la versión de Python 3 enlazada es la 3.5, hacer python3 hola.py equivale a /usr/bin/python3.5 /home/manuel/hola.py. Además, por cada versión de Python instalada en nuestro sistema operativo, podemos contar con su gestor de paquetes PIP.
¿Que ocurre si quiero probar cosas muy distintas con Python (por ejemplo desarrollo web, matemáticas, etc)? Que al final tengo instalado desde pip una cantidad de paquetes "basura", que no voy a usar ¿Y si quiero usar una versión de una librería para un proyecto y otra versión para otro? Pues que tendría que estar instalando/desinstalando cada vez que tenga que ponerme con un proyecto u otro. Ya se empieza a ver que esto es un engorro, ¿verdad?

Virtualenv

Para solucionar todo esto se creó un concepto llamado "Entorno virtual" o Virtualenv. Consiste en decir "venga quiero tener una versión (aislada del sistema operativo) de Python con su pip para poder cacharrear/trabajar, y cuando me harte la borro y listo" ¿Por qué aislada? Porque el sistema operativo usa Python para sus cosas también, así que es recomendable siempre, en la medida de lo posible, no tocar nunca el Python del sistema.

Toda la información está en su web -> Virtualenv, y para instalarlo es tan sencillo como ejecutar pip install virtualenv o pip3 install virtualenv.

Una vez instalado, generamos un virtualenv nuevo con la instrucción virtualenv <nombre-del-virtualenv>. Supongamos que quiero hacer un virtualenv para probar desarrollo web con Python 3.6 (siempre que tenga Python 3.6 instalado en el sistema). Pues hago virtualenv web --python=python3.6, esto me creará una carpeta en el directorio donde esté que se llamará web. Dentro de esta carpeta tendré un montón de carpetas y con un python3.6 listo para usarse.
Para activar el virtualenv tendremos que ejecutar que se llama activate dentro del virtualenv. Imaginemos que el virtualenv webesta en el directorio /home/manuel/, pues para activarlo desde la terminal ejecuto source /home/manuel/web/bin/activate. Ahora veremos como en el promptde la consola (la linea donde ponemos los comandos) delante de todo pone (web). Eso quiere decir que tenemos el virtualenv activado. si ahora ejecutamos python --version y pip --version veremos que está usando el python y el pip del virtualenv.

Para poder salir del virtualenv solo tenemos que ejecutar deactivatey veremos como el (web) desaparece del prompt.

Si queremos borrar el virtualenv, tenemos que borrar toda la carpeta web.

El problema de esto, es que es un poco engorroso tener que estar poniendo la ruta del activate cada vez que quieras acceder al virtualenv. Para hacerlo un poco-bastante más cómodo, se creó Virtualenvwrapper.

Virtualenvwrapper

Es una utilidad montada sobre virtualenv que permite trabajar con entornos virtuales de manera mucho más cómoda.

Para instalarlo solo tenemos que hacer pip install virtualenvwrappero pip3 install virtualenvwrapper con el pip del sistema. Una vez instalado, tenemos que configurarle un par de cosillas más. Dentro del script que usa nuestra terminal .bashrco .zshrc (está en el directorio home), hay que añadir al menos 3 líneas:

  1. Hay que indicarle en que directorio se van a guardar todos los virtualenvs. Por lo general se suele poner la carpeta .virtualenvsen el home.
  2. Opcionalmente se le puede indicar en que carpeta vas a tener los programas/códigos/proyectos. Así cuando actives un virtualenv, directamente te va a abrir esa carpeta (lo cual es mucho más cómodo). Yo por ejemplo voy a usar la carpeta Code.
  3. Hay que indicarle donde se encuentra el script de virtualenvwrapper, que se llama virtualenvwrapper.sh. Una manera de saber donde se encuentra en nuestro sistema es ejecutar. Supongamos que lo ha encontrado en la carpeta /usr/local/bin/.

Así que al final de nuestro fichero /home/manuel/.bashrc o /home/manuel/.zshrc añadimos

export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/Code
source /usr/local/bin/virtualenvwrapper.sh

Y lo cargamos con source ~/.bashrco source ~/.zshrc. Una vez lo tengamos cargado, ya podemos trabajar con virtualenvwrapper.

Con el comando mkvirtualenv podemos crear un entorno virtualenv de manera más cómoda. Si quisiera crear el entorno virtual de antes ejecutaríamos mkvirtualenv -p python3.6 web. Esto no solo nos crea el virtualenv web con Python 3.6 sino que además nos lo abre.

Si queremos cerrar el virtualenv usamos deactivate.

Para poder ver que entornos virtuales tenemos en el sistema ejecutamos workon. Y si queremos abrir uno en concreto, por ejemplo web, ejecutamos workon web. Si tenemos otro virtualenv que se llame kivy por ejemplo, podemos abrirlo desde el virtualenv web sin problemas. Al hacer workon kivy desde web, esto cerrará el virtualenv web y abrirá el de kivy.

Cuando queramos borrar un virtualenv usaremos el comando rmvirtualenv. Así para borrar el virtualenv web hacemos rmvirtualenv web.

Pyenv -> Distintas versiones de Python en tu sistema

Esta información está sacada de este gran artículo de david Naranjo. Los pasos son:

  1. Instalar dependencias
sudo apt-get install -y make build-essential git libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev
  1. Instalar pyenv en tu sistema y añadirlo a tu shell (ZSH en mi caso)
curl -L https://raw.githubusercontent.com/pyenv/pyenv-installer/master/bin/pyenv-installer | zsh
  1. Modificar el fichero de configuración de la shell (.zshrc en mi caso)
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
  1. Recargar la shell y usarlo
source ~/.zshrc

Para usarlo es muy sencillo.

Versiones instalables

pyenv install -l

Versiones instaladas con Pyenv

pyenv versions

Instalar una version de Python

Para instalar la versión x.xx.x de Python, por ejemplo la 3.5.3, haríamos

pyenv install 3.5.3

Esto instalará un interprete de Python 3.5.3 en la carpeta ~/.pyenv/versions/

Definir versión global del sistema

Supongamos que quisieramos cambiar la versión de Python Global del sistema COSA PARA NADA RECOMENDADA. Existe un comando en pyenv que permite esto. Veamos como cambiar la versión de global de Python del sistema, y como deshacer el entuerto.

  1. Supongamos que mi sistema operativo tiene por ejemplo Python 3.6.6 como versión del sistema, y se encuentra su ejecutable en /usr/bin/python3
  2. Si quisiera usar por ejemplo Python 3.5.3 como versión global, haría lo siguiente
pyenv global 3.5.3
  1. Si yo ahora en mi terminal hago
python3 --version

Obtendré 3.5.3 como respuesta. Pero este Python no se encuentra en /usr/bin/, sino que se encuentra en ~/.pyenv/versions/3.5.3/bin

  1. Si quiero deshacer este entuerno, lo que debo es abrir el fichero ~/.pyenv/version. Dentro se encuentra escrito 3.5.3. Simplemente con borrar el contenido y guardar, al ir ahora al terminal y ejecutar
python3 --version

veremos como sale por pantalla 3.6.6. Esto lo podemos ver si ejecutamos el comando

pyenv versions

Y tendremos algo asi como

* system (set by /home/klin/.pyenv/version)
  3.5.3

Donde indica como la versión del sistema es la definida en ~/.pyenv/version, que al ser ninguna, es la del sistema.

Editar $PYTHONPATH

La solución ha sido obtenida de aquí.
Supongamos que estuvieramos creando un proyecto python con la siguiente estructura:

proj
|-src
  |-foo.py
|-examples
  |-examplebar
    |- bar.py

Y que el fichero bar.py contiene la siguiente línea

from src import foo

Si desde proj ejecutamos

python examples/examplebar/bar.py

Lo más probable es que la consola nos dé un error como
ModuleNotFoundError: No module named 'src'
Esto es porque proj no está añadido a la variable de entorno $PYTHONPATH. Para ver que contiene podemos abrir la consola de python y ejectuar

import sys
sys.path

Podremos comprobar como nuestro directorio no está. Para añadir el directorio a la variable hay muchas maneras, pero como yo uso virtualenv con virtualenvwrapper (entre otras cosas), solución es bien sencilla:

  1. Desde la terminal nos vamos al directorio proj.
  2. Activamos el virtualenv correspondiente workon ....
  3. Escribimos en la terminal add2virtualenv .. Esto añadirá el actual directorio a la variable $PYTHONPATH.

Y ya está, ya podremos ejecutar sin problemas nuestros ejemplos.

Si quisieramos deshacer lo que hemos hecho, simplemente en el paso 3. de antes ejecutamos add2virtualenv -d ., y con eso sería suficiente.