Actualizar versión de Python de un entorno virtual de Poetry

Actualizar no, perdón, eliminar y crear de nuevo

Una pequeña receta para actualizar la versión del interprete de Python que usamos en un entorno virtual creado con Poetry.

En otras plataformas, actualizar la versión del interprete (por ejemplo, y salvando las distancias, la versión del framework en .NET) es relativamente sencillo. Sin embargo en Python no lo es tanto y de hecho es un proceso un poco demasiado manual.

Básicamente el proceso consiste en eliminar el entorno virtual y volver a crearlo con la versión de Python requerida.

Primero tenemos que saber donde está el interprete asociado al entorno virtual:

poetry env info --executable

El anterior comando nos dará la ruta al fichero python.exe usado por el entorno virtual.

Ahora eliminaremos el entorno virtual:

poetry env remove <PATH_TO_PYTHON.EXE>

En este punto, vamos a crear un nuevo entorno virtual pero seleccionando la versión concreta de Python:

poetry env use <PATH_TO_DESIRED_PYTHON.EXE>

<PATH_TO_DESIRED_PYTHON.EXE> puede sacarla primero listando la versiones de Python instaladas con py --list y, como normalmente la última versión será la de por defecto (la que muestra un asterisco en el listado), con where.exe python tendrás la ruta.

Aquí también puede pasar (dependiendo de si estás haciendo un upgrade o un downgrade) que poetry te diga que la versión de Python no es compatible con la dependencia que hay en el fichero pyproject.toml. Te dirá algo así: The specified Python version (3.8.10) is not supported by the project (^3.12). Please choose a compatible version or loosen the python constraint specified in the pyproject.toml file.. Es decir, quiero bajar de 3.12 a 3.8.10, luego tocar editar previamente el fichero pyproject.toml para ajustar la dependencia de Python.

Otro punto a tener en cuenta es si usas black, recordar establecer correctamente el valor de target-version

A partir de aquí, haremos lo que haríamos si hubiésemos clonado el repo de un proyecto por primera vez:

poetry install
poetry shell
pre-commit install

Para confirmar la versión de Python en el entorno virtual:

poetry env info

Por otro lado, ya que estás actualizando lo mismo te interesa actualizar también dependencias del proyecto.

Aunque no es una dependencia al uso, te podría interesar (si lo usas, claro) los hooks de pre-commit. Esto puedes hacerlo con pre-commit autoupdate que actualizará rev: <NUMBER> del fichero .pre-commit-config.yaml.

En cuanto a librerías, lo primero es ejecutar poetry show --outdated --ansi para ver si hay nuevas versiones disponibles.

Si simplemente quieres actualizar respetando la especificación con caret, es decir, algo como ^1.2.3, con poetry update debería bastar.

Si por el contrario quieres subir la versión te tocará usar poetry add. Por ejemplo, en mi caso la salida de poetry show --outdated --ansi me dice lo siguiente:

flake8        5.0.4  6.1.0  the modular source code checker: pep8 pyflakes and co

Como en el fichero pyproject.toml tengo flake8 = "^5.0.4", poetry update flake8 no hace nada. Sin embargo, con poetry add "flake8==^6.1.0" --group=dev ahora sí actualizo a la versión 6.1.0 y también actualizo la especificación de versión en el fichero pyproject.toml. Un cambio así requiere probar bien que todo funciona, lógicamente.

Un saludo!


Ver también