¡No mueva la carpeta de su proyecto de Python!

By Sergei Alekseev(Fullstack Developer) on Junio 28 2020

Views

13746

#python#tips and tricks#virtual environment

La introducción

En el principio de mi camino en el desarollo de python me conocé el entorno virtual de Python que fue muy bueno hallazgo par mi. Antes de esto tuve un verdadero desastre en mi entorno de desarollo: todas las bibliotecas de cada proyecto se instalaron en un solo lugar. Y cuando me pregunté: "Cual dependencias tengo para este proyecto?". No pude contestar.

Si eres un principiante en Python y no sabes que es el entorno virtual definitivamente deberías empezar a usarlo en tu vida de desarrollo.

En pocas palabras, el entorno virtual de python te permite aislar todas las dependencias de bibliotecas de python para tu proyecto particular. Entonces si tienes varios proyectos que usan varias versiones de una biblioteca, por ejemplo, tu proyecto viejo de la universidad usa django 1.1.0 y tu proyecto reciente de blog usa django 3.0.7 - en este caso para cada proyecto creas entorno virtual separado y instalas tu nuevas o viejas cosas allí.

Cuando empecé el desarrollo de este blog cambie el nombre de mi proyecto de "djangoblog" a "www.salvicode.com". Y en algun momento me di cuenta que todas las bibliotecas instaladas por pip install my_library se instalaron a la carpeta general de python ignorando el entorno virtual que se encuentra en venv/lib/python3.7/site-packages y pip freeze me dio resultado como si llamo afuera del entorno virtual. Pasé un dia tratando de enterarme que pasó. Mis búsquedas en google como "python virtual env no funciona", "python virtual env pip freeze issues", etc. no me dieron muchos resultados. Pensé que rompí todo y decidí dejar del desarrollo borrar el entorno virtual y crearlo desde cero. Todo empezó a funcionar bien. La solucion fue de los tipos de solucion como "trate de apagar y encender tu computadora, señor. Gracias for tu llamada."

Intentemos analizar lo que sucedió allí con el entorno virtual de Python.

Los prerrequisitos

En el momento de escribir este articulo uso Python 3.7.

Tambien pip deberia ser installado: https://www.poftut.com/how-to-install-pip-on-macos/

Para trabajar con el entorno virtual puedes usar python3 -m venv o instalar virtualenv.

Yo uso Mac OS 10.15.5. Así que eres un usuario de Windows habra algunas diferencias en la activación del entorno virtual (No puedo decir más qué hay en Windows).

Pasos de reproducción

Crea una carpeta de proyecto de python en algun lado y ve allí:

mkdir venv_test
cd venv_test

Crea un entorno virtual y lo llama venv:

python3 -m venv venv

O si usas virtualenv:

virtualenv venv

Ejecute el siguiente para activar el entorno virtual:

source venv/bin/activate

(venv) significa que has activado el entorno virtual. Vamos a ver que bibliotecas tenemos en nuestro entorno virtual:

pip freeze

Nada, verdad? Instale django

pip install django

Y ahora vamos a ver que hemos instalado:

pip freeze

En mi caso me muestra la biblioteca django y sus dependencias que fueron instalados con django:

Y ahora vamos a analizar nuestra sistema.

Desactive el entorno virtual y salga de la carpeta venv_test:

deactivate
cd ..

Y cambie el nombre de nuestra carpeta de venv_test a venv_test_new:

mv venv_test venv_test_new

Ve a esa carpeta nueva y trate de activar nuestro entorno virtual:

cd venv_test_new
source venv/bin/activate

Ahora deberias ver que todo es bien:

Activating virtual environment at new location

Muestra (venv), no errores son mostrado, la clima es calma. Ejecute pip freeze

Pip freeze command at new location

¿Bastante, eh? ¿Has installado algo antes? ¿No? Yo tampoco. ¿Y donde esta nuestra biblioteca de django?

Bajo el capó

Vamos a ver por que sucedio esto.

Python resuelve todas las cosas del entorno virtual con bash scripts que se encuentran en venv/bin/ . Abre los archivos activate, activate.csh y activate.fish. Los tres contienen la ruta ABSOLUTA de tu carpeta anterior. En mi caso estos lineas son:

# activate
VIRTUAL_ENV="/Users/sergeialekseev/Work/salvicode/venv_test/venv"
export VIRTUAL_ENV

# activate.csh
setenv VIRTUAL_ENV "/Users/sergeialekseev/Work/salvicode/venv_test/venv"

# activate.fish
set -gx VIRTUAL_ENV "/Users/sergeialekseev/Work/salvicode/venv_test/venv"

Sí. Esta es la razon por que nuestro entorno virtual no funciona correctamente. Y la cosa divertida aqui es que nada nos informa sobre esto.

La solución 1

La idea basica es mover nuestro proyecto a la carpeta anterior(venv_test), activar el entorno virtual, recibir la lista de las bibliotecas que usamos con pip freeze > requirements.txt, deactivar el entorno virtual, borrar tu entorno virtual(venv), mover tu proyecto a la carpeta nueva(venv_test_new) y crear nuevo entorno virtual con python -m venv venv y instalar todas las bibliotecas con pip install -r requirements.txt.

La solución rapida y facil. Es la mi preferida. Pero funcionará si sabes tu ruta anterior y al menos tienes buen habito de actualizar el archivo de las dependencias(requirements.txt) cada vez cuando agregas nueva biblioteca.

La solución 2

Vamos a actualizar estos tres archivos: activate, activate.csh, activate.fish

Encuentre todas las rutas anteriores y reemplazarlas con tu nueva ruta.

¿Piensas que es todo? No. Tambien necesitas modificar todos los archivos de python que puedes encontrar en venv/bin . Usualmente es solo la parte superior del archivo.

# pip, pip3, etc. files
#!/Users/sergeialekseev/Work/salvicode/venv_test/venv/bin/python3
...

No he verificado esta solución. Pero al menos cuando llamas pip freeze despues me muestra las bibliotecas correctas.

No recomiendo esta forma porque me parece que es algo inestable. Si no tienes otra opcion puedes ejecutar pip freeze > requirements.txt y luego por si acaso recrear el entorno virtual como hicimos en la solucion anterior.

La solución 3

He encontrado una discusión en esta tema de stackoverflow. Hay una mencion sobre --relocatable durante la creacion del entorno virtual con vritualenv. No he probado esto. ¿Puede ser verificas esto y dejas me saber como funciona?

La solución 4

Use Pipenv. Nunca lo he usado pero he leido sobre esto. Y me parece que es algo que te puede ayudar y simplificar tu vida:)

Conclusión

Siempre es mejor tener los habitos buenos antes de empezar a hacer algo. Quiero decir tener el archivo requirements.txt con todas las dependencias de tu proyecto es un habito bueno:)

Espero que te ayudé no perder el tiempo tratando averiguar WTF pasó con el entorno virtual.

Bajo construcción

Usualmente un blogger pone aquí algunos artículos relativos. Estoy trabajando en crear más contenido interesante. Tan pronto como tengo algun contenido relativo implementaré algo de lógica aquí. A continuación puede encontrar algunos comentarios. Si no hay nada, es tu oportunidad de dejar el primer comentario:) PS.Me alegra que esté aquí y lea esto^^

Sergei Alekseev

Fullstack Developer

Discusión