Cómo Gestionar tus Proyectos Python con pyenv y Poetry
Aprendiendo a gestionar tus proyectos Python de manera sencilla y práctica
Introducción
Tanto si tienes experiencia con Python como si acabas de empezar a aprender este lenguaje, en algún momento ocuparás paquetes de terceros para implementar alguna funcionalidad en el proyecto que estás desarrollando.
Cuando instalas Python, este viene acompañado de pip, un gestor de paquetes que tiene acceso al Python Package Index, abreviado como PyPi, donde están publicados la mayoría de paquetes de terceros disponibles para usarse con el lenguaje.
En distribuciones GNU/Linux, Python viene instalado por defecto, ya que algunas aplicaciones o elementos del escritorio se desarrollan con este lenguaje. Dependiendo del modelo de desarrollo y liberación de actualizaciones de la distribución, la versión de Python disponible puede ser 3.7 o 3.8; además, aunque la versión 2.7 dejó de tener soporte el 1 de enero de este año, algunas distribuciones aún incluyen esta versión.
Si pip no está disponible, puede instalarse desde los repositorios usando el gestor de paquetes, puede aparecer como python-pip
o python3-pip
, dependiendo del sistema operativo.
Si usas pip para gestionar las dependencias de tu proyecto, es probable que ocupes diferentes versiones de un mismo paquete para diferentes proyectos, y dado que se instalan en la misma ruta, Python no diferencia entre una versión y otra; además, pueden generarse conflictos entre dependencias.
Para resolver el problema descrito antes puedes combinar el uso de esta herramienta con la creación de entornos virtuales. De esa forma los paquetes que instales en el entorno virtual solo estarán disponibles para ese proyecto y no para todo el sistema.
Para crear entornos virtuales para proyectos Python instalamos el paquete virtualenv
usando pip. Y para administrar esos entornos virtuales podemos usar virtualenvwrapper.
Demasiadas herramientas, ¿no? Además, no debemos olvidar que si queremos distribuir el código de nuestra aplicación desde un repositorio de Git o publicar en un servicio en la nube que soporte Python, hay que crear el archivo requirements.txt en donde se colocará la lista de dependencias del proyecto, para luego instalarlas ejecutando pip install -r requirements.txt
.
¿Y si queremos usar una versión diferente de Python para cada proyecto? Existen herramientas como pyenv y Poetry que permiten gestionar las versiones de Python y las dependencias y entornos virtuales de cada proyecto de mejor manera, para que así no sea necesario instalar tantos paquetes. Y es sobre estas herramientas de lo que hablaré en este artículo.
pyenv
pyenv es una herramienta que permite instalar diferentes versiones de Python y cambiar entre ellas según los requerimientos del proyecto en el que se esté trabajando. Es un fork de rbenv y ruby-build que fue modificado para Python.
Para instalar pyenv puedes usar Homebrew en MacOS, ejecutando brew install pyenv.
Si estás en Windows, pyenv no funciona fuera del Windows Subsystem for Linux, por lo que para instalar puedes usar pyenv-win, un fork de pyenv
desarrollado por Kiran Kumar Kotari.
En Windows puedes instalar pyenv-win
usando pip desde Git Bash o Powershell:
pip install pyenv-win --target ~/.pyenv
También puede instalarse usando Chocolatey:
choco install pyenv-win
En distribuciones GNU/Linux puedes instalar la herramienta desde los repositorios o a través del instalador automático. Pero antes debes asegurarte que las dependencias de pyenv estén instaladas en el sistema. En la wiki, en el repositorio oficial, hay una sección llamada Common build problems que contiene instrucciones para algunos sistemas operativos.
Dependencias
Debian/Ubuntu:
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
xz-utils tk-dev libffi-dev liblzma-dev python-openssl git
Fedora:
sudo yum install zlib-devel bzip2 bzip2-devel readline-devel sqlite \
sqlite-devel openssl-devel xz xz-devel libffi-devel findutils curl \
&& sudo yum groupinstall 'Development Tools'
Centos:
sudo yum install @development zlib-devel bzip2 bzip2-devel readline-devel sqlite \
sqlite-devel openssl-devel xz xz-devel libffi-devel findutils curl
Arch Linux y derivados:
sudo pacman -S --needed base-devel openssl zlib bzip2 readline sqlite curl \
llvm ncurses xz tk libffi python-pyopenssl git
Instalación
pyenv está disponible en los repositorios de Arch Linux y distribuciones basadas en este sistema, como Manjaro. Para otros sistemas operativos se debe usar el instalador automático.
Arch Linux y derivados:
sudo pacman -S pyenv
Instalador automático:
curl https://pyenv.run | bash
Configuración
Después de instalarlo, pyenv agrega las siguientes líneas a tu bashrc
:
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
Ejecutando:
echo 'export PATH="$HOME/.pyenv/bin:$PATH"' >> ~/.bashrc && \
echo 'eval "$(pyenv init -)"' >> ~/.bashrc && \
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc
Para que los cambios surtan efecto en la terminal actual, ejecuta el siguiente comando:
exec $SHELL
Comandos básicos
Versión instalada de pyenv
Para conocer la versión instalada de pyenv
ejecuta pyenv -v
que mostrará lo siguiente:
pyenv 1.2.17
Actualización de pyenv
Para actualizar a la última versión disponible, ejecuta pyenv update
, si has realizado la instalación usando el instalador automático. En MacOs, ejecuta brew upgrade pyenv
.
Si instalaste pyenv usando el gestor de paquetes de tu distribución, como en el caso de Arch Linux o distribuciones basadas en este sistema, puedes actualizar usando pacman
cuando la actualización esté disponible en los repositorios.
En Windows puedes actualizar pyenv-win
usando pip o Chocolatey, dependiendo de qué herramienta elegiste para instalar:
pip install --upgrade pyenv-winchoco upgrade pyenv-win
Gestionar versiones de Python instaladas
Versiones de Python
Ejecuta pyenv install --list
o pyenv install -l
para listar las versiones de Python disponibles para instalación; el comando mostrará los números de versión; además, puedes instalar otras implementaciones del lenguaje, como CPython, Jython, MicroPython, etc.
pyenv install --list
Available versions:
2.1.3
2.2.3
2.3.7
2.4.0
2.4.1
2.4.2
2.4.3
Ejecuta pyenv versions
para conocer las versiones de Python instaladas en el sistema.
pyenv versions* system (set by /home/usuario/.pyenv/version)
3.7.7
En principio solo estará disponible la versión de Python instalada por defecto en nuestro sistema. El *
al inicio indica la versión que se está usando en el directorio actual, que también puede conocerse ejecutando:
pyenv version
system (set by /home/usuario/.pyenv/version)
Instalación
Cuando decidas qué versión de Python usarás en tu proyecto, puedes instalarla ejecutando pyenv install version
. Por ejemplo, si necesitas la última versión de Python 3.7, debes ejecutar:
pyenv install 3.7.7
El comando anterior descargará e instalará la versión 3.7.7 del lenguaje, que estará disponible desde $(pyenv root)/versions
.
Si necesitas pasar alguna opción de configuración a la instalación, puedes usar la variable de entorno CONFIGURE_OPTS
. Por ejemplo, si necesitas instalar Python con la opción de bibliotecas compartidas activada, el comando deberá ejecutarse como:
env PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.7.7
Y actualizar la variable de entorno LD_LIBRARY_PATH
:
export LD_LIBRARY_PATH=~/.pyenv/versions/3.7.7/lib/
Usando la versión de Python instalada
Para indicar que versión de Python se usará para el proyecto puedes ejecutar cualquiera de los siguientes comandos:
pyenv local 3.7.7pyenv global 3.7.7
El primer comando le dice al sistema que la versión de Python que usaremos para el proyecto será 3.7.7
y que esa versión solo estará disponible en el directorio del proyecto.
El segundo comando indica al sistema que la versión que se usará en todo el sistema será 3.7.7
y que estará disponible en todos los directorios.
Desinstalación
Para desinstalar alguna de las versiones de Python instaladas con pyenv
ejecutamos:
pyenv uninstall 3.7.7
También podemos eliminar el directorio correspondiente en $(pyenv root)/versions
. Si queremos conocer la ruta específica en el sistema donde se instaló la versión de Python que queremos eliminar, podemos ejecutar:
pyenv prefix 3.7.7
Podemospasar el resultado del comando anterior al comando rm
como parámetro para eliminar el directorio.
rm -rf $(pyenv prefix 3.7.7)
Poetry
Poetry es una herramienta con la que puedes gestionar las dependencias de tu proyecto, ayudándote a instalarlas y mantenerlas actualizadas; además, te permite administrar el entorno virtual correspondiente.
Instalación
Para instalar Poetry en MacOS, distribuciones GNU/Linux y Windows (a través del Windows Subsystem for Linux) puedes ejecutar el siguiente comando, que descargará y ejecutará el script de Python get-poetry.py.
curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python
En algunos sistemas operativos como Arch Linux y distribuciones basadas en este, y Fedora, Poetry puede instalarse desde los repositorios.
Arch Linux y derivados:
sudo pacman -S python-poetry
Fedora (con yum o dnf):
sudo yum install poetrysudo dnf install poetry
Comandos básicos
Nuevo proyecto
Para crear un nuevo proyecto se ejecuta el siguiente comando:
poetry new poetry-demo
El comando anterior creará un directorio con la siguiente estructura:
poetry-demo
├── pyproject.toml
├── README.rst
├── poetry_demo
│ └── __init__.py
└── tests
├── __init__.py
└── test_poetry_demo.py
Para indicar las dependencias y versión de Python que se usarán en el proyecto, hay que editar el archivo pyproject.toml
, del que hablaremos enseguida. Poetry lee este archivo para saber qué versión de Python se usará en el proyecto, configurar el entorno virtual correspondiente y descargar las dependencias.
Especificar dependencias
Para agregar las dependencias del proyecto hay que editar el archivo pyproject.toml
, también pueden agregarse ejecutando el siguiente comando:
poetry add pendulum
El comando anterior encontrará la versión adecuada de este paquete y lo instalará junto con las subdependencias correspondientes.
Para eliminar una dependencia puedes ejecutar:
poetry remove pendulum
Para especificar las dependencias también podemos editar el archivo pyproject.toml
. Este archivo contiene lo siguiente:
[tool.poetry]
name = "poetry-demo"
version = "0.1.0"
description = ""
authors = ["Mario García <hi@mariog.xyz>"]
[tool.poetry.dependencies]
python = "*"
[tool.poetry.dev-dependencies]
pytest = "^3.4"
En la línea python = "*"
hay que indicar la versión de Python que se usará en el proyecto, aunque este valor lo obtiene del archivo .python-version
que más adelante explicaré como configurar.
Debajo de esa línea se colocan las dependencias del proyecto, indicando la versión específica o usando el comodín *
para decirle a Poetry que descargue la última versión disponible. Por ejemplo:
[tool.poetry.dependencies]
python = “*”
firebase = “*”
python-jwt = “*”
gcloud = “*”
sseclient = “*”
pycrypto = “*”
requests-toolbelt = “*”
En el ejemplo anterior están las dependencias y subdependencias de un proyecto que ocupa la biblioteca de Firebase disponible en PyPi.
El archivo pyproject.toml
también puede configurarse con la instrucción poetry init
que, de forma interactiva, solicitará la información correspondiente al proyecto para configurar el archivo.
Instalación
Para instalar las dependencias del proyecto y configurar el entorno virtual correspondiente se ejecuta el comando poetry install
.
Pero no hay que olvidar que debemos indicar que versión de Python se usará. Además, las versiones de Python disponibles en el sistema se están gestionando con pyenv.
En el directorio del proyecto se ejecuta el siguiente comando para indicar qué versión de Python se usará en ese directorio.
pyenv local 3.7.7
Enseguida, hay que decirle a Poetry qué versión de Python se usará para configurar el entorno virtual.
poetry env use 3.7.7
El comando anterior crea el archivo .python-version
.
Después de configurar, se ejecuta el comando poetry install
que creará el entorno virtual y descargará las dependencias del proyecto. Esta instrucción creará el archivo poetry.lock
, que bloqueará las dependencias, para que cualquiera que use la aplicación o biblioteca siempre tenga las mismas versiones.
Para activar el entorno virtual y ejecutar instrucciones dentro de este, hay que ejecutar poetry shell
.
También se pueden ejecutar comandos directamente dentro del entorno virtual; para ello, en la línea de comandos, escribe poetry run
seguido de la instrucción.
Actualización de dependencias
Para obtener las últimas versiones de las dependencias y actualizar el archivo poetry.lock
puedes ejecutar el comando:
poetry update
Si necesitas actualizar solo algunas de las dependencias, puedes ejecutar el mismo comando de la siguiente forma:
poetry update requests toml
Manejo de entornos virtuales
Si deseas obtener información del entorno virtual activado en ese momento, puedes usar el comando:
poetry env info
Que mostrará la siguiente información:
Virtualenv
Python: 3.7.7
Implementation: CPython
Path: /path/to/poetry/cache/virtualenvs/test-O3eWbxRl-py3.7
Valid: TrueSystem
Platform: linux
OS: posix
Python: /path/to/main/python
Si quieres obtener una lista de todos los entornos virtuales asociados con el entorno actual, ejecuta:
poetry env list
Que mostrará como salida lo siguiente:
test-O3eWbxRl-py2.7
test-O3eWbxRl-py3.6
test-O3eWbxRl-py3.7 (Activated)
Y si deseas cambiar entre una versión de Python u otra, escribe la siguiente instrucción en la línea de comandos:
poetry env use 3.7.7
Que genera el archivo .python-version
que Poetry lee, para saber qué versión de Python usar para configurar el entorno.
Por último, si quieres eliminar un entorno virtual existente, ejecuta el comando:
poetry env remove 3.7.7
Conclusión
En este artículo hemos visto cómo el usar herramientas como pyenv y Poetry puede ayudarnos a gestionar los proyectos que desarrollemos con Python. Hemos tratado los puntos clave de ambas herramientas, desde de la instalación en diferentes sistemas operativos, hasta los comandos básicos que debemos conocer.
Si te ha gustado el artículo, ¡No dudes en darle un aplauso y dejar un comentario!