Movatterモバイル変換


[0]ホーム

URL:


Skip to content
tacosdedatos
Search Log in Create account

tacosdedatos

tacosdedatos is a community of 1,142 amazing taquites

tu sitio para aprender sobre visualización y ciencia de datos, en tu idioma.

Create accountLog in
TwitterFacebookGithubInstagramTwitch
Sergio Sánchez
Sergio Sánchez

Posted on

Automatizando crear entornos virtuales

Ayer visitando el tuiter-espacio me encontré esta queja de python:

Irving MA profile image
Irving MA
@moaimx
twitter logo
Odio python y su manera de romperse cuando instalas algo que no le gusta... y no, no voy a estar haciendo virtual envs cada que quiero analizar una maldita base de datos. Y ya, ese es todo el tuit
03:52 AM - 24 Mar 2022
Twitter reply actionTwitter retweet actionTwitter like action

Tan común que tiene su propio comic de XKCD
Cómic de XKCD ilustrando todas las maneras de instalar python en una red muy complicada

Los entornos virtuales en python es de los conceptos mas difíciles de explicar a principiantes y es algo importantísimo tanto para desarrolladoras de software como quienes trabajamos con datos. No importa cuantos años tengas trabajando con python, siempre vas a tener problemas con tus entornos virtuales.

Cada cierto tiempo aparece una nueva herramienta para manejar entornos virtuales - poetry, virtualenv, conda. Ya parece javascript sacando un nuevo framework cada semana 😛

Python incluye una biblioteca (venv) en su (biblioteca estándar (standard library) para crear entornos virtuales (documentación oficial de python en español).
Puedes crear un entorno virtual de la siguiente manera:

python3-m venv camino/al/directorio/nombre_del_entorno
Enter fullscreen modeExit fullscreen mode

O sea, si yo estoy en mi terminal y quiero ir a un directorio "repos" en mi directorio "Documents", crear un nuevo directorio donde voy a comenzar un nuevo proyecto llamado "super-tacos", crear un nuevo entorno virtual e instalarpandas,pyjanitor,sidetable,rich,altair,jupyter ypip-chill (comosiempre lo hago 😩) - tengo que hacer todo esto en mi terminal:

# me voy a reposcdDocuments/repos# creo directorio pa'l proyectomkdirsuper-tacoscdsuper-tacos# creo mi entorno e instalo paquetespython3-m venv venvsourcevenv/bin/activate# en MacOS lo activas usando sourcepython3-m pipinstall--upgrade pippython3-m pipinstallpandas pyjanitor sidetable rich altair jupyter pip-chill
Enter fullscreen modeExit fullscreen mode

💡 tip #1
¿Sabías que puedes darle nombre a tu entorno virtual? A partir de python 3.6 puedes pasar el argumento--prompt para pasar unastring que aparece en tu terminal cuando esta este entorno activado.

Por defecto, tus nuevos entornos virtuales se llamanvenv:
entorno virtual por default

Si le pasas el argumento--prompt . (con el. significando "este directorio en el que nos encontramos") tu nuevo entorno virtual compartirá nombre con el directorio de tu proyecto
entorno virtual con nombre

DRY - Don't Repeat Yourself

De hecho, yo se que esto de la filosofía DRY es más complejo (creo ?) pero me gustan los acrónimos. El punto es: si estás haciendo algosimilar muy seguido, tal vez puedas automatizarlo.

En mi caso, yo creé una función deshell (un script de shell en wikipedia lo llaman "guión de concha" 😂enlace). Esencialmente, estos comandos en la terminal (cd aquí,mkdir esto, crear el entorno, instalar paquetes) son los mismos con cada proyecto. Lo único que estoy cambiando es el nombre del proyecto.

Oportunidad perfecta para la automatización
hackerman

⚠️ Yo no soy desarrollador de software y no utilizoshell "profesionalmente". Es decir, yo utilizoscripts deshell/bash para resolver mis problemas. Esto significa que tal vez no sea la manera mas eficiente de resolverlos y si tu sabes de esto me deberías dejar un comentario con tus recomendaciones 👀 plis 🙏

Mi función es la siguiente:

#!/bin/bashfunctionnewrepo(){NEW_REPO="$HOME/Documents/repos/$1"mkdir"$NEW_REPO"||echo"$1 already exists in repos/"cd"$NEW_REPO"||exitgit initecho"#$1"> README.md    print".ipynb_checkpoints/\n__pycache__/\n.venv/\nvenv/\n"> .gitignore    python3-m venv venvsourcevenv/bin/activate    python3-m pipinstall--upgrade pip    python3-m pipinstallpandas pyjanitor sidetable rich altair jupyter pip-chill    pip-chill--no-chill> requirements.txt}
Enter fullscreen modeExit fullscreen mode

Vayamos por partes:

NEW_REPO="$HOME/Documents/repos/$1"mkdir"$NEW_REPO"||echo"$1 already exists in repos/"cd"$NEW_REPO"||exit
Enter fullscreen modeExit fullscreen mode

La primera línea esta creando unastring insertando dos variables. $HOME el cual es el directorio~ (el directorio en el que te encuentras por defecto al abrir la terminal). La variable$1 representa el primer valor que le pasas a la funciónnewrepo. Desde mi terminal puedo escribirnewrepo super-tacos y ese segundo cachito de texto (el primerodespués de llamar la función) "super-tacos" es el valor de$1. Si le pasara más argumentos, se guardarían en variables$2,$3 y así sucesivamente.

Mi nueva variableNEW_REPO entonces se vuelve"~/Documents/repos/super-tacos".

La segunda línea tiene el operador|| que es equivalente aor o| en otros lenguages. Es decir, "haz esto o, si no puedes, haz esto." Entonces esta segunda línea dice "crea el directorioNEW_REPO o si no se puede, por alguna razón, escribe (echo) 'super-tacos ya existe'" (ya que 'super-tacos' es el valor de la variable$1. Aquí estoy asumiendo que la razón por la que no pudimos crear el directorio es por que ya existía otro con el mismo nombre ahí pero técnicamente existen más razones por las cuales podría recibir un error y no poder crear el directorio ahí (tal vez no tengo permiso, tal vez no es un nombre válido, etc). Pero no estoy creando una biblioteca para publicar y que mucha gente la use - este script y esta lógica funcionalo suficiente para mis necesidades. No te claves en la perfección, plebe.

En la tercera línea intentamos entrar a este nuevo directorio (cd dechange directory). Puedes ver el operador|| de nuevo. Aquí, si por alguna razón no podemos entrar al nuevo directorio vamos a terminar todo (exit).
meme de "se cancela todo"

git initecho"#$1"> README.mdprint".ipynb_checkpoints/\n__pycache__/\n.venv/\nvenv/\n"> .gitignorepython3-m venv venv
Enter fullscreen modeExit fullscreen mode

Las siguientes 4 líneas hacen lo siguiente:

  1. Inicializargit para el control de versiones
  2. Crear un archivo README.md con la línea "# super-tacos" (como un título en markdown -# = "Header 1" =<h1>)
  3. Crear un archivo.gitignore con 4 líneas:
    • .ipynb_checkpoints/ - jupyter produce estos automáticamente
    • __pycache__/ - python produce estos automáticamente
    • .venv/ - hay gente que utiliza.venv para su entorno virtual
    • venv/ - nosotros utilizamosvenv en este script
  4. Creamos el entorno virtual

💡 Usamosprint en lugar deecho para crear el.gitignore ya que estamos utilizando el caracter\n que significa "nueva línea" yecho no lo maneja. Peroprint yecho hacen esencialmente lo mismo.

Hasta aquí podríamos terminar nuestro script. Ya creamos un nuevo directorio, inicializamosgit y creamos nuestro entorno virtual. Si abrimos este directorio en VS Code, VS Code va a encontrar este entorno virtual automáticamente. Aun te va a pedir que confirmes que ese es el entorno virtual que quieres utilizar pero ahora solo estas a un click de comenzar tu análisis de datos.

sourcevenv/bin/activatepython3-m pipinstall--upgrade pippython3-m pipinstallpandas pyjanitor sidetable rich altair jupyter pip-chillpip-chill--no-chill> requirements.txt
Enter fullscreen modeExit fullscreen mode

Las siguientes 4 líneas toman más tiempo en ejecutarse y si no fuera porque en serio uso python y estos paquetes para la gran mayoría de mis proyectos no las incluiría.

  1. Activamos nuestro entorno virtual.
  2. Actualizamospip.
  3. Instalamos bibliotecas que casi siempre uso.
  4. Utilizamos la bibliotecapip-chill para crear unrequirements.txt más sencillo que el comúnpip freeze

¿qué es pip-chill?

Repositorio en GitHub

pip-chill es comopip freeze pero muestra solo los paquetes que no son dependencias de otros paquetes. Por ejemplo,pyjanitor ysidetable son librerías que extienden la funcionalidad depandas y cuando las instalas también instalaspandas (si no lo tienes instalado). Esto significa que tu requirements.txt no necesita incluirpandas. Mi requirements.txt normalmente se ve así:

altair==4.2.0jupyter==1.0.0pyjanitor==0.22.0rich==12.0.1sidetable==0.9.0
Enter fullscreen modeExit fullscreen mode

No incluyepandas porque al instalar estas bibliotecas también vas a instalarpandas.


Como usarnewrepo desde la terminal

Yo utilizoOh My Zsh

Zsh es un shell, como bash o fish, que interpreta comandos y los ejecuta. Oh My Zsh es un framework construido sobre zsh que está estructurado para permitirle tener plugins y temas, así como proporcionar lo que creemos que son las mejores configuraciones desde el principio. Puedes usar zsh sin Oh My Zsh, pero no puedes usar Oh My Zsh si no tienes zsh.

Y cada que abro mi terminal se ejecuta el archivo~/.zshrc (así es como tengo las funcionalidades dezsh cada que "inicio una sesión" en mi terminal.)

Ahora puedo guardar mi funciónnewrepo en un archivo.my_aliases (o como quiera llamarle) y en~/.zshrc agrego la línea

source ~/.my_aliases
Enter fullscreen modeExit fullscreen mode

Ya que guardé mi archivo.my_aliases en el mismo directorio que.zshrc (o sea,~ o$HOME).

Ahora, cada que abra una terminalzsh va a también ejecutar el código de.my_aliases y definir la funciónnewrepo.

Ahora, simplemente utilizonewrepo <NOMBRE_DE_MI_PROYECTO> desde la terminal y tengo un nuevo directorio con un entorno virtual de python listo para explorar datos. Todo con un solo comando.

Siguientes pasos

Esto funciona para mi por que:

  1. Todos mis proyectos los creo en el directorioDocuments/repos/
  2. Casi siempre voy a utilizar python y estos paquetes

Lo importante aquí es que podemos automatizar procesos repetitivos. Yo estoy utizandovenv de python pero igual pudieramos automatizar la creación de un entornoconda o un proyecto conpoetry.

shell no es un lenguaje que practico mucho y no es tan común en el mundo de los datos (es mas común de lo que creemos pero nadie tuitea como 'mira mi nuevo script de shell para rascar datos de esta página y analizarlos automáticamente' como lo hace la gente de python o R.)

Te dejo unas herramientas que he utilizado para trabajar con datos desde la línea de comandos conshell:

  1. jq - trabajar con JSONhttps://stedolan.github.io/jq/
  2. visidata - trabaja con datos tabulareshttps://www.visidata.org/
  3. mapshaper - transforma archivos cartográficoshttps://github.com/mbloch/mapshaper
  4. csvs-to-sqlite - transforma CSVs en bases de datos SQLitehttps://github.com/simonw/csvs-to-sqlite
  5. ffmpeg - manipula video y audiohttps://ffmpeg.org/ (este esta chido conyoutube-dlhttp://ytdl-org.github.io/youtube-dl/)

Discussion(0)

Subscribe
pic
Editor guide
loading
Create template

Templates let you quickly answer FAQs or store snippets for re-use.

Dismiss

Are you sure you want to hide this comment? It will become hidden in your post, but will still be visible via the comment'spermalink.

For further actions, you may consider blocking this person and/orreporting abuse

Read next

ioexception profile image

Mejorando nuestros gráficos de barras

Antonio Feregrino -

ioexception profile image

Visualizando temblores con ridgeline plots

Antonio Feregrino -

ioexception profile image

Decoradores en Python

Antonio Feregrino -

ioexception profile image

La notación de brackets en Pandas

Antonio Feregrino -

imaginemos cosas chingonas. data rules everything around me. #BlackLivesMatter
  • Location
    Bahía de San Francisco, California, EEUU
  • Education
    UC Davis '16
  • Work
    Data Engineer @ TalkingPoints | el mero mero @ tacosdedatos
  • Joined

More fromSergio Sánchez

tacosdedatos

tu sitio para aprender sobre visualización y ciencia de datos, en tu idioma.

Log in Create account

[8]ページ先頭

©2009-2025 Movatter.jp