Articles

Cómo usar pyenv para ejecutar varias versiones de Python en un Mac

Administrar un entorno de desarrollo local de Python sigue siendo un desafío, incluso para desarrolladores experimentados. Si bien hay estrategias bien documentadas para la administración de paquetes, hay otro paso necesario para asegurarse de que está ejecutando la versión de Python que necesita cuando la necesita.

¿Por qué importa la versión de Python?

Es un concepto extraño al principio, pero los lenguajes de programación cambian como cualquier otro software. Tienen errores, correcciones y actualizaciones como cualquiera de sus API favoritas y cualquier otro software. De manera similar, las diferentes versiones se identifican por un número de tres dígitos conocido como versión semántica.

😭 😭 😭 pic.twitter.com/yt1Z2439W8

– Denny Perez (@dennyperez18) 28 de mayo de 2019

Durante muchos años, Python 2 fue la versión principal comúnmente utilizada del lenguaje de programación. En enero de 2020, Python 2 llegó al final de su vida útil, y solo Python 3 será compatible con los mantenedores del núcleo del lenguaje a partir de entonces. Python 3 se está desarrollando constantemente y lanzando nuevas actualizaciones con regularidad. Eso hace que sea importante para mí recibir regularmente esas actualizaciones.

Recientemente, intenté ejecutar un proyecto en macOS que dependía de Python 3.5.9, una versión que no tenía instalada en mi sistema. Puede parecer lógico pensar que el pip del administrador de paquetes de Python podría instalarlo*, pero ese no fue el caso:

$ pip install python3.5.9
Collecting python3.5.9
ERROR: Could not find a version that satisfies the requirement python3.5.9 (from versions: none)
ERROR: No matching distribution found for python3.5.9

Alternativamente, podría haber descargado esa versión del sitio web oficial de Python, pero ¿cómo la ejecutaría en mi Mac junto con mi versión existente de Python? Especificar la versión de Python que pretendo usar cada vez que corro el intérprete (python3.7 o python3. 5 por ejemplo) parece propenso a errores en el mejor de los casos. Tiene que haber una manera mejor.

(Una nota sobre lo anterior: Sé que esto no tiene sentido para un desarrollador experimentado de Python, pero tenía sentido para mí en ese momento. Me encantaría hablar de por qué sigo pensando que debería.)

Instalación y configuración de pyenv

Afortunadamente, pyenv existe para trabajar en torno a esta serie de complejidades. Para empezar, necesitaba instalar pyenv. Podría clonarlo y compilarlo yo mismo desde el código fuente, pero prefiero administrar paquetes como este a través del gestor de paquetes Homebrew:

$ brew install pyenv

Para usar la versión de Python a través de pyenv, es esencial comprender la variable de RUTA del shell. PATH determina dónde busca el shell los archivos por el nombre del comando. Debe asegurarse de que el shell encuentre la versión de Python ejecutada por pyenv, no la instalada por defecto (que a menudo se llama la versión del sistema). Si no cambia la ruta, aquí está el resultado:

$ which python
/usr/bin/python

Esa es la versión del sistema de Python.

Para configurar pyenv correctamente, puede ejecutar lo siguiente en Bash o zsh:

$ PATH=$(pyenv root)/shims:$PATH

Ahora, si comprueba la versión de Python, verá que es la administrada por pyenv:

$ which python
/Users/my_username/.pyenv/shims/python

Que la instrucción export (PATH=) solo cambiará para esta instancia de shell, así que hágalo un cambio permanente, debe agregarlo a sus archivos de puntos. Dado que zsh es oficialmente el shell predeterminado de macOS, me centraré en él. Añade la misma sintaxis a~/.archivo zshrc:

$ echo 'PATH=$(pyenv root)/shims:$PATH' >> ~/.zshrc

Ahora cada vez que ejecutemos un comando en zsh, utilizará la versión pyenv de Python. Tenga en cuenta que utilicé comillas simples con eco para que no evalúe y expanda los comandos.

El .el archivo zshrc solo administra instancias zsh, así que asegúrese de verificar qué es su shell y editar los archivos de puntos asociados. Si necesita verificar cuál es su shell predeterminado, puede ejecutar echo SHELL SHELL. Si es zsh, utilice el comando anterior. Si usas Bash, cambia ~/.zshrc a~/.bashrc. Puede sumergirse en la configuración de rutas en el LÉAME de pyenv si desea obtener más información.

Usando pyenv para administrar versiones de Python

Ahora que pyenv tiene el control, podemos ver que solo tiene disponible el sistema Python:

$ pyenv versions
system

Como se mencionó anteriormente, no desea usar esta versión (lea más sobre por qué). Ahora que pyenv está configurado correctamente, quiero que tenga algunas versiones diferentes de Python que uso regularmente.

Hay una manera de ver todas las versiones de Python disponibles de todos los diferentes repositorios a los que tiene acceso pyenv ejecutando pyenv install list list. Es una lista larga y abrumadora que puede ser útil revisar en el futuro. Por ahora, me quedo con la última versión de cada punto (3.5.x ó 3.6.x, donde x es la última) que se encuentra en la página de descarga de Python. Con eso en mente, instalaré 3.5.9 y 3.8.0:

$ pyenv install 3.5.9
$ pyenv install 3.8.0

Esto llevará un tiempo, así que toma un poco de té (o lee uno de los enlaces anteriores). Es interesante notar que la salida recorre la descarga y construcción de esa versión de Python. Por ejemplo, la salida muestra que el archivo proviene directamente de Python.org.

Una vez que todo esté instalado, puede configurar sus valores predeterminados. Me gusta vivir a la vanguardia, por lo que establezco mi versión global predeterminada de Python a la última:

$ pyenv global 3.8.0

Y esa versión se establece inmediatamente en mi shell. Para confirmar:

$ python -V
Python 3.8.0

El proyecto que quiero ejecutar solo funciona con Python 3.5, por lo que configuraré la versión localmente y confirmaré que está en uso:

$ pyenv local 3.5.9
$ python -V
Python 3.5.9

Debido a que usé la opción local con pyenv, agregó un archivo a mi directorio actual para rastrear esa información.

$ cat .python-version
3.5.9

Ahora, finalmente puedo configurar un entorno virtual para el proyecto que quiero y asegurarme de que estoy ejecutando la versión correcta de Python.

$ python -m venv venv
$ source ./venv/bin/activate
(venv) $ which python
/Users/mbbroberg/Develop/my_project/venv/bin/python

Para obtener más información, consulte este tutorial sobre la administración de entornos virtuales en un Mac.

Terminar

De forma predeterminada, ejecutar varias versiones de Python puede ser un desafío. Creo que comenzar con pyenv garantiza que tengo las versiones de Python que necesito configuradas para ejecutarse cuando las necesito.