DEV Community

Cover image for Entornos Virtuales Python en fish usando Oh-My-Fish y Pyenv
Cristian Javier Azulay
Cristian Javier Azulay

Posted on • Updated on

Entornos Virtuales Python en fish usando Oh-My-Fish y Pyenv

Una manera directa de crear entornos virtuales Python 3.8 usando el shell fish

Pyenv y el Modulo venv de Python

Pyenv

Primero, usamos Pyenv para instalar o seleccionar una implementacion de Python distinta a la del sistema. Podemos verificar primero si tenemos la versión de Python que necesitamos mediante

> pyenv versions
* system (set by /home/cjadeveloper/.pyenv/version)
  3.6.8
  3.7.4
  3.8.2
Enter fullscreen mode Exit fullscreen mode

De no tenerlo instalado, haríamos un pyenv install 3.8.2 pero como ya lo tengo instalado, lo selecciono para el proyecto haciendo

pyenv local 3.8.2
Enter fullscreen mode Exit fullscreen mode

Esto nos va a crear un archivo .python-version en el directorio que nos permitirá 2 cosas, guardar una referencia de la versión de Python con la que trabajaremos en el proyecto y cambiar la versión global de Python por la que hemos elegido.

NOTAS:

  1. Este mecanismo se puede anular configurando la variable de entorno PYENV_VERSION o con el comando pyenv shell.

  2. Tanto el comando pyenv local [version] como pyenv global [version] nos permiten definir mas de una version a usar al mismo tiempo en un proyecto. Esto es muy útil para usar con herramientas como tox por ejemplo.

  3. Si al configurar un intérprete local (o global) no funciona en fish (Es decir que siempre nos inicia el interprete de Python por defecto instalado). Vamos a tener que editar el archivo de configuración de fish ~/.config/fish/config.fish y agregar las siguientes líneas:

setenv PYENV_ROOT "$HOME/.pyenv"
setenv PATH "$PYENV_ROOT/shims:$PYENV_ROOT/bin:$PATH"
pyenv rehash
Enter fullscreen mode Exit fullscreen mode

Creando un entorno virtual dentro del proyecto con el modulo venv directamente

La forma que a mi más me gusta trabajar con los entornos virtuales de Python es la que se conoce como "own site directory" de la misma manera que se suele trabajar con los modulos en Node: "Creando una carpeta dentro del proyecto que estamos trabajando en la que contenga nuestra versión de los paquetes que queremos aislar de los del sistema y el propio binario de Python (que va a coincidir con el usado para crear el venv)." Para hacer todo ello de un solo paso, podemos usar el modulo venv que esta disponible desde la versión 3.3 de Python, de la siguiente manera

python -m venv .venv
Enter fullscreen mode Exit fullscreen mode

Esto nos creará un entorno virtual de nombre .venv en el directorio actual y bajo la carpeta /.venv

Activando nuestro entorno virtual bajo fish

Si estamos usando fish con Oh-My-Fish como infraestructura y tenemos instalados unos de sus temas, activar un entorno virtual python de la manera tradicional puede romper el bonito prompt que hayamos configurado con Oh-My-Fish. Para que esto no suceda tenemos que setear la variable de entorno VIRTUAL_ENV_DISABLE_PROMPT en 1 en nuestro archivo de configuración de fish que, generalmente se encuentra en ~/.config/fish/

# ~/.config/fish/config.fish

# ... another config

set -x VIRTUAL_ENV_DISABLE_PROMPT 1
Enter fullscreen mode Exit fullscreen mode

Luego, hay que recargar el shell, para que vuelva a leer los archivos de config, mediante exec fish. Con esto no se nos va a romper el shell al usar algún tema de Oh-My-Fish. Ésto lo haremos solo la primera vez. Luego podemos activar el entorno virtual sin tener que configurar nuevamente la variable VIRTUAL_ENV_DISABLE_PROMPT, claro ésta.

Para desactivar el entorno, simplemente escribimos deactivate en la consola.

Entendiendo un poco más que hace el módulo venv

Otra forma de gestionar el entorno virtual sin usar el script que sobreescribe nuestro prompt es hacer nuestro propio activador de entorno virtual cambiando el valor de la variable de entorno PATH que es el que le dice a nuestro shell que instancia de Python usar cuando llamemos al interprete. Para entender a que nos referimos vamos a listar la variable $PATH y ver su contenido antes de la activación

> echo $PATH
/home/cjadeveloper/.pyenv/shims /home/cjadeveloper/.pyenv/bin /home/cjadeveloper/.local/bin /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin
Enter fullscreen mode Exit fullscreen mode

Cuando invoca a un intérprete de Python o ejecuta un script .py, su shell busca en los directorios listados en el diccionario PATH en orden, hasta que encuentra una instancia de Python. Para ver qué instancia de Python encuentra primero PATH, ejecute el comando que viene con pyenv: pyenv which python.

> pyenv which python
/home/cjadeveloper/.pyenv/versions/3.8.2/bin/python
Enter fullscreen mode Exit fullscreen mode

Entonces lo que tenemos que hacer es indicarle al principio del path la ruta del interprete de python que queremos usar. Lo podemos hacer sobreescribiendo la variable de entorno PATH para la sesión actual del shell así

set -lx PATH (realpath .venv/bin) $PATH
Enter fullscreen mode Exit fullscreen mode

Lo anterior significa que definimos una variable PATH local y exportada que va a incluir delante del path actual la ruta completa a la carpeta .venv/bin que estoy especificando. Esta variable PATH al ser local y exportada va a permanecer activa en la sesion actual solamente y prevalecera sobre la variable PATH heredada del shell. Esto tiene su pro y su contra, como veremos mas adelante.

Pero sigamos con el path, por un momento. Al volver a consultar la variable PATH vamos a obtener lo siguiente

> echo $PATH
/home/cjadeveloper/code/examples/python/venvexs/venv1/.venv/bin /home/cjadeveloper/.pyenv/shims /home/cjadeveloper/.pyenv/bin /home/cjadeveloper/.local/bin /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /sbin /bin
Enter fullscreen mode Exit fullscreen mode

Con el path del entorno virtual creado anteriormente inyectado al principio. Por ende, si verificamos python nuevamente, vamos a tener

> which python
/home/cjadeveloper/code/examples/python/venvexs/venv1/.venv/bin/python
Enter fullscreen mode Exit fullscreen mode

Ahora podemos simular lo que hace virtualenv con su script de activación y establecer el prompt de shell un poco mas bonito e informativo seteando la variable de entorno VIRTUAL_ENV que es usada por fish para indicar que estamos dentro de un entorno virtual

set VIRTUAL_ENV "$PWD/.venv"
Enter fullscreen mode Exit fullscreen mode

Ya estamos listos para usar python en nuestro entorno virtual. Primero que todo veamos si estamos utilizando la versión de pip correcta para instalar nuestros paquetes. Podemos hacerlo de 2 formas:

pip show pip
Enter fullscreen mode Exit fullscreen mode

o también (y es la que algunos prefieren para estar 100% de trabajar con el intérprete que desean)

python -m pip show pip
Enter fullscreen mode Exit fullscreen mode

Hooray! Ahora podemos hacer nuestro día en Python y cuando terminamos, solamente hay que setear el PATH nuevamente

set -lx PATH $PATH[2..-1]
Enter fullscreen mode Exit fullscreen mode

Y salir del entorno, reiniciando el shell.

exec fish
Enter fullscreen mode Exit fullscreen mode

Referencias

Top comments (0)