Volver

Gestores de paquetes, entornos y notebooks

La clase de hoy se hará en dos apartados

1º parte $\rightarrow$ 📽️
2º parte $\rightarrow$ 🖥️

El objetivo es aprender cómo se desarrolla un programa complejo en Python, utlizando los bloques de construcción que nos dan los paquetes de terceros.

También veremos un entorno de desarrollo muy visual que nos facilita crear un proyecto desde cero.

Módulos

  • Cuando un programa crece, se hace exponencialmente más difícil trabajar con un solo fichero con todas nuestras funciones y lógica del programa
  • A veces es conveniente reusar la implementación de funciones y algoritmos complejos, y abstraerlos como ''cajas negras''.

Un ejemplo sencillo: imaginemos que queremos hacer un programa para calcular las raíces de un polinomio $\sum_{i=1}^n a_ix^i = 0$. Podríamos modularizar cada parte del programa y organizar el proyecto como:


    poly_calc/
        main.py                 # El programa principal, que importa los módulos necesarios y enseña un menú
        entrada.py              # Módulo para pedir los coeficientes al usuario
        metodos_exactos.py      # Módulo con los métodos exactos (para polinomios de grado 1-4)
        metodos_numericos.py    # Módulo con los métodos aproximados (para polinomios de grado 5+)

                    
Ahora imaginémonos que queremos extender el programa a polinomios trigonométricos $\sum_{i=1}^n a_i\sin(x)^i + b_i\cos(x)^i = 0$. Podríamos añadir un módulo nuevo trig.py. ¿Pero también tenemos que implementar las funciones seno y coseno? No, podemos importarlas de la librería estándar de Python.

        from math import pi, sin, cos
        print(sin(0), cos(pi/2))

                    
La sintaxis para importar y exportar módulos en Python es muy sencilla:

    # (Asumiendo la estructura de archivos de la diapositiva anterior)
    # main.py
    import entrada                                  # Importar un módulo
    import metodos_exactos as me                    # Importar un módulo con un alias
    from metodos_numericos import newton_raphson    # Importar una función específica

    # Usemos las funciones de los módulos importados
    pol = entrada.pedir_coeficientes()

    if len(pol) == 3:
        me.resolver_grado_3(pol)
    elif len(pol) > 4:
        newton_raphson(pol)
    ...



    # Los archivos de módulo simplemente definen las funciones
    # entrada.py
    def pedir_coeficientes():
        ...
    
    # metodos_exactos.py
    def resolver_grado_3(pol):
        ...
    
    # metodos_numericos.py
    def newton_raphson(pol):
        ...
    
                    

La librería estándar de Python

La instalación de Python cuenta, además de con el intérprete del lenguaje, con una librería estándar con funcionalidades esenciales

Algunos ejemplos de módulos de la librería estándar son:

  • math: funciones matemáticas
  • random: números pseudo-aleatorios y distribuciones
  • time y datetime: Fecha y hora
  • shutil y pathlib: Manejo de archivos y directorios
  • os: funciones para interactuar con el sistema operativo
  • re: expresiones regulares
  • csv: archivos CSV
  • $\dots$
Un artículo interesante con las funciones y módulos más usadas de la librería estándar


Paquetes

¿Qué hacemos si necesitamos una funcionalidad que no está en la librería estándar?

🤓Dejamos de ser vagos y desarrollamos código🤓

Paquetes

¿Qué hacemos si necesitamos una funcionalidad que no está en la librería estándar?

🤓Dejamos de ser vagos y desarrollamos código🤓 🗿Usamos paquetes🗿

  • En Python, una gran comunidad de desarrolladores ha creado infinidad de paquetes con los que se pueden construir todo tipo de programas con facilidad, incluso sin ser un experto en la materia.
  • Estos paquetes incluyen módulos que podemos importar de la misma forma que los desarrollados por nosotros.
  • Los gestores de paquetes facilitan enormemente su instalación, veremos como funcionan pip y conda

Gestores de paquetes

pip

https://pypi.org/project/pip/

  • Es el gestor por defecto de paquetes de Python
  • Permite instalar, actualizar y manejar dependencias entre paquetes
  • Se pueden guardar configuraciones en archivos requirements.txt

    # Estos comandos se ejecutan en una terminal!
    # NOTA: Si tienes varias versiones de Python instaladas, 
    # usar python -m pip en vez de pip
    pip --version         # Comprobar versión instalada
    
    # Gestionar paquetes
    pip install manim # Instalar el paquete manim
    pip install --upgrade manim # Actualizar el paquete manim
    pip install --uninstall manim # Desinstalar el paquete manim

                            

pip

Una tarea importante suele ser compartir nuestra lista de paquetes con otros desarrolladores

1. Listamos los paquetes

pip list

$\rightarrow$

2. Guardamos los paquetes

pip freeze > requirements.txt

$\rightarrow$

3. Instalamos los paquetes

pip install -r requirements.txt

(mini)conda

Similar a pip, pero tiene más funcionalidades y es más utilizado con paquetes matemático/científicos

Descargar instalador

Buscar paquetes

Algunas diferencias con pip:

  • Los paquetes de conda están pre-compilados, así que su instalación es más rápida
  • Resuelve dependencias automáticamente: evita tener conflictos entre versiones
  • Incluye entornos virtuales que facilitan cambiar entre proyectos
  • Existen muchos más paquetes adicionales en conda-forge

conda

La instalación de paquetes es tan sencilla como con pip:


    conda install numpy  # Instalar el paquete numpy
    conda update numpy   # Actualizar el paquete numpy
    conda remove numpy   # Desinstalar el paquete numpy

    conda install conda-forge::openai  # Instalar el paquete openai desde conda-forge
                    

Entornos virtuales

Los entornos virtuales son una forma de aislar los paquetes de Python para que no interfieran entre sí

Esto es útil cuando trabajamos en varios proyectos que requieren versiones diferentes de los mismos paquetes


    conda env list   # Ver la lista de entornos
    conda create -n mi_env python=3.10  # Crear un nuevo entorno
    conda activate mi_env  # Activar el entorno
    conda deactivate  # Salir del entorno
    conda env remove -n mi_env  # Eliminar el entorno

    # Guardar el entorno en un archivo
    conda env export > env.yml

    # Cargar el entorno desde un archivo
    conda env create -f env.yml
                            
  • Se puede mezclar pip y conda en los entornos, pero no es muy recomendable (de todas formas, a veces es necesario porque en pip hay más paquetes)
  • No queremos acabar con situaciones como las de la imagen

Jupyter Notebooks

En la siguiente parte de la clase, abriremos vscode y nos pondremos a jugar con paquetes, veremos que podemos hacer con ellos

Pero primero, hace falta explicar que son los Jupyter Notebooks (esto es mucho menos enrevesado que lo anterior, we promise)

Uso de notebooks en vscode

    1. Instalamos las extensiones de vscode de Jupyter y Python

    $\rightarrow$

    2. Creamos un nuevo fichero .ipynb dónde trabajaremos

    $\rightarrow$

    3. Configuramos el kernel de nuestro nuevo entorno de conda

Descarga de Notebooks

Ahora pasaremos a una clase interactiva, trabajaremos con los siguientes ficheros que podéis descargar aquí mismo:

Introducción a Jupyter Notebook