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 web
esta en el directorio /home/manuel/
, pues para activarlo desde la terminal ejecuto source /home/manuel/web/bin/activate
. Ahora veremos como en el prompt
de 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 deactivate
y 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 virtualenvwrapper
o 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 .bashrc
o .zshrc
(está en el directorio home), hay que añadir al menos 3 líneas:
- Hay que indicarle en que directorio se van a guardar todos los virtualenvs. Por lo general se suele poner la carpeta
.virtualenvs
en el home. - 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
. - 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 ~/.bashrc
o 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:
- 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
- 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
- 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 -)"
- 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.
- 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
- Si quisiera usar por ejemplo Python 3.5.3 como versión global, haría lo siguiente
pyenv global 3.5.3
- 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
- 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:
- Desde la terminal nos vamos al directorio
proj
. - Activamos el virtualenv correspondiente
workon ...
. - 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.