Saltar al contenido

Activando cosas cuando entramos en un entorno virtual

Todos nos hemos acostumbrado a trabajar con entornos virtuales creados con venv, virtualenv, pipenv, conda,… Hacen nuestra vida más sencilla evitando conflictos de versiones, problemas de reproducibilidad y otra serie de cosas.

Hay veces que queremos que nuestra vida sea incluso más sencilla. Por ejemplo, cuando estamos trabajando en algo relacionado con web quizá necesitemos usar las credenciales para una API, o cuando trabajamos con algo científico el 99% de las veces necesitaremos trabajar con JupyterLab o Jupyter Notebook o Spyder,…

Tanto venv como conda nos permiten realizar una serie de acciones cuando activamos o desactivamos entornos virtuales. En este artículo vamos a ver cómo.

Aprovechándonos de activate en venv.

Para crear un nuevo entorno virtual con venv hacemos lo siguiente desde la línea de comandos:

python -m venv env

En el anterior código se creará una carpeta llamada env en el directorio donde nos encontremos. Si queremos activar el entorno virtual que acabamos de crear podemos hacer, siempre desde la línea de comandos:

  • En Windows:
env\Scripts\activate
  • En Linux:
source env/bin/activate

En la línea de comandos deberías ver que el prompt tiene un prefijo que debería ser algo como (env). Eso indica que tenemos el entorno virtual activado.

Ahora, para mostrar una acción que involucre, por ejemplo, al Jupyter Notebook vamos, primero, a instalarlo (tenemos que tener nuestro nuevo entorno virtual activado para que se instale en el mismo):

pip install notebook

Con otras herramientas como virtualenvwrapper tenemos la posibilidad de ejecutar cosas usando un script postactivate. El problema es que no hay versión estable desde febrero de 2019, el desarrollo en windows es una biblioteca separada, hay que instalar cosas nuevas, etc.

Vamos a ver cómo hacerlo sin necesidad de instalar nuevas herramientas. Una vez que tenemos instalado Jupyter Notebook vamos a modificar el script activate para que ejecute una serie de acciones después de activar el entorno.

El script activate se encontrará en (mira la primera tabla que aparece en este enlace):

  • Windows: .\env\Scripts\activate.bat
  • Linux: ./env/bin/activate

Vamos a editar ese script y vamos a añadir al final, después de todo lo que ya aparezca, lo siguiente:

  • En Windows:
set JUPORT=8777
start /min jupyter notebook --port %JUPORT%
  • En Linux:
export JUPORT=8777
jupyter notebook --port $JUPORT &

Lo anterior, lo único que hace es establecer una variable de entorno, JUPORT en la primera línea añadida, que usaré para que Jupyter Notebook se inicie usando el número de puerto que se especifica en la variable de entorno, segunda línea añadida. Nada muy sofisticado.

Ahora podemos guardar nuestros cambios en el fichero activate que acabamos de modificar y salir del entorno virtual usando el comando deactivate desde la línea de comandos.

Una vez hecho lo anterior podemos activar de nuevo nuestro entorno virtual como hemos hecho más arriba pero ahora se iniciará Jupyter Notebook en el puerto 8777 cada vez que activemos el entorno virtual:

  • En Windows:
env\Scripts\activate
  • En Linux:
source env\bin\activate

A partir de aquí, puedes añadir lo que se te ocurra y sea más útil para tu entorno de trabajo.

Podrías hacer cosas similares en el script deactivate para ejecutar linters o mypy o black…, cuando terminas de trabajar con el código usado por el entorno virtual (aunque se me ocurren formas más sencillas o prácticas de hacer esto).

Aprovechándose de lo mismo desde conda

Con conda podemos hacer algo parecido pero de forma ligeramente diferente. Al menos, a diferencia de lo que pasa con venv, se encuentra documentado.

  • Ventajas: Hay una forma clara de hacerlo. De hecho lo hacen muchos paquetes. Está documentado y te indican algunas buenas prácticas como el nombrar tus modificaciones.

Para este caso vamos a crear un entorno conda que se llamará pruebaenv:

conda create -n pruebaenv

Una vez creado lo podemos activar

conda activate pruebaenv

y se modificará la variable de entorno CONDA_PREFIX que se usa para saber qué estamos usando (si el entorno virtual base, si el entorno virtual pruebaenv). Además, en el prompt deberías ver el siguiente prefijo (pruebaenv). Vamos a ver lo que me diría el valor de CONDA_PREFIX en el caso del entorno pruebaenv:

  • En Windows puedes escribir:
echo %CONDA_PREFIX%

Y te daría algo como (dependerá del usuario, de dónde y cómo hayas instalando conda, etc):

C:\Users\ErKiko\AppData\Local\Continuum\miniconda3\envs\pruebaenv
  • En Linux puedes escribir:
echo $CONDA_PREFIX

y te daría algo como (nuevamente, dependerá de varias cosas):

/home/ErKiko/miniconda3/envs/pruebaenv

Vamos a instalar spyder en este entorno porque lo usaremos en nuestro ejemplo:

conda install -c conda-forge spyder -y

Dentro del entorno que hemos creado, pruebaenv, quizá haya una carpeta ./etc/conda/activate.d. Si no existe la puedes crear.

¿Por qué quizá existe? Porque podría haber sido creada por otras bibliotecas que hemos instalado al instalar Spyder y, en ese caso, ya estaría creada la carpeta. En nuestro entorno pruebaenv creo que nada de lo que hemos instalado hace uso de eso por lo que no debería estar creada la carpeta (en Windows no y en Linux sí).

Podríamos hacer algo similar con ./etc/conda/deactivate.d si queremos que se realice alguna acción al salir del entorno virtual pruebaenv.

Vamos a crear un script de activación que haga alguna cosa que nos interese. Por ejemplo, yo voy a hacer que cuando active el entorno se me abra spyder. Tienes que hacer lo siguiente:

  • En Windows crearemos el fichero miscosas-activate.bat en la carpeta de antes (./etc/conda/activate.d). Dentro del fichero añadiremos la siguiente línea:
START /min python -m spyder.app.start
  • En Linux crearemos el fichero miscosas-activate.sh en la carpeta de antes (./etc/conda/activate.d). Dentro del fichero añadiremos la siguiente línea:
python -m spyder.app.start

¡¡Y ya estaría listo!!

Pensamientos finales

Espero que alguna de las recetas os pueda resultar útil y si queréis podéis compartir en los comentarios este truco y como lo estáis usando o cualquier otro truco interesante.

Saludos.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

eight + one =

Pybonacci