Saltar al contenido principal

5.6 Paquetes

1️⃣ Qué es un paquete​

Un paquete es una carpeta que contiene varios módulos relacionados. Para que Python reconozca una carpeta como paquete, debe contener un archivo especial llamado __init__.py.

Estructura básica de un paquete​

mi_paquete/
│
├── __init__.py
├── modulo1.py
└── modulo2.py
  • __init__.py indica a Python que esta carpeta debe tratarse como un paquete.
  • Dentro pueden existir varios módulos (modulo1, modulo2, etc.).
  • Se pueden importar usando la notación con puntos:
Ejemplo de importación de un módulo perteneciente a un paquete
from mi_paquete import modulo1
modulo1.funcion_principal()

2️⃣ Importaciones relativas y absolutas​

Python distingue entre dos tipos de importaciones dentro de un paquete:

🟩 Importación absoluta​

Usa la ruta completa desde el paquete raíz.

from mi_paquete.modulo1 import funcion

🟦 Importación relativa​

Usa puntos para indicar la relación con el módulo actual.

from . import modulo1             # mismo nivel
from ..subpaquete import modulo2 # un nivel superior
nota

Las importaciones relativas se usan dentro de un paquete para mantener la organización interna sin depender del nombre del paquete principal.


3️⃣ El archivo __init__.py​

__init__.py es un elemento clave en la estructura de los paquetes de Python. Su función principal es indicar al intérprete que una carpeta debe tratarse como un paquete Python, permitiendo importar sus módulos de forma estructurada.

Cuando Python encuentra una carpeta con un archivo llamado __init__.py, considera esa carpeta un paquete. Esto habilita el uso de sentencias como:

import mi_paquete.modulo1

o

from mi_paquete import modulo2

Sin este archivo, la carpeta se trataría como un directorio normal y no sería posible importar sus módulos directamente.

🟩 Contenido del archivo​

El archivo __init__.py puede estar vacío, pero también puede incluir código de inicialización o controlar qué elementos se exportan cuando el paquete se importa.

A continuación se muestran las tres formas más comunes de utilizarlo:

Paquete vacío (solo marcador)​

# __init__.py
# Archivo vacío

# Este archivo indica que la carpeta es un paquete Python.
Uso típico

Ideal cuando el paquete solo sirve como contenedor de módulos (modulo1.py, modulo2.py, etc.) y no requiere ninguna configuración inicial.

Inicialización del paquete​

# __init__.py
print("Inicializando el paquete mi_paquete...")

variable_global = "Versión 1.0"

def saludar():
print("Hola desde el paquete mi_paquete")
Uso típico

Este enfoque se usa cuando el paquete necesita ejecutar código o definir variables comunes al ser importado. Por ejemplo, establecer valores globales, cargar configuraciones o inicializar registros.

import mi_paquete

mi_paquete.saludar() # -> "Hola desde el paquete mi_paquete"
print(mi_paquete.variable_global) # -> "Versión 1.0"

Controlar las importaciones (variable __all__)​

El archivo __init__.py puede definir explícitamente qué módulos se cargarán cuando se use la instrucción from paquete import *.

# __init__.py
__all__ = ["modulo1", "modulo2"]

Esto evita importar módulos no deseados o internos.

Ejemplo de uso
from mi_paquete import *
en este ejemplo

En este caso, solo se cargarán los módulos listados en __all__ (modulo1 y modulo2), aunque existan otros en el paquete.

Importaciones internas para simplificar el acceso​

Otra práctica común es reexportar módulos o funciones internas desde __init__.py, para que puedan ser accedidas directamente al importar el paquete.

# __init__.py
from .modulo1 import funcion_a
from .modulo2 import ClaseB

De este modo, se puede acceder a los elementos directamente sin necesidad de mencionar los submódulos:

from mi_paquete import funcion_a, ClaseB

En lugar de:

from mi_paquete.modulo1 import funcion_a
from mi_paquete.modulo2 import ClaseB

🟦 Buenas prácticas​

RecomendaciónMotivo
Dejarlo vacío si no se necesita inicialización.Evita sobrecargar el paquete.
Usar __all__ para controlar qué se importa.Mejora la organización y seguridad del código.
Documentar su contenido con comentarios.Facilita el mantenimiento en proyectos grandes.
Evitar ejecutar código complejo dentro de __init__.py.Puede generar comportamientos inesperados al importar.

🟨 Ejemplo completo de paquete​

Estructura del proyecto:

mi_paquete/
│
├── __init__.py
├── modulo1.py
└── modulo2.py

Contenido de los archivos:​

Contenido de __init__.py
# __init__.py
from .modulo1 import saludar
from .modulo2 import despedir
__all__ = ["saludar", "despedir"]
Contenido de modulo1.py
# modulo1.py
def saludar():
print("Hola desde modulo1")
Contenido de modulo2.py
# modulo2.py
def despedir():
print("Adiós desde modulo2")

Uso en otro script:​

from mi_paquete import saludar, despedir

saludar()
despedir()

# Hola desde modulo1
# Adiós desde modulo2

4️⃣ Gestión de paquetes en Python​

Python destaca por su enorme ecosistema de librerías, frameworks y herramientas creadas por la comunidad. Estas extensiones no forman parte del núcleo del lenguaje, pero se pueden instalar fácilmente gracias al sistema de gestión de paquetes compuesto por:

  • PyPI (Python Package Index) → el repositorio oficial donde se almacenan los paquetes.
  • pip → el programa que permite descargar e instalar dichos paquetes.
  • venv o virtualenv → herramientas para crear entornos virtuales aislados.

Este sistema facilita la instalación, actualización y distribución de software Python en cualquier entorno.

🟩 ¿Qué es PyPI?​

PyPI (Python Package Index) es el repositorio oficial de paquetes de Python, gestionado por la Python Software Foundation (PSF). En él se alojan cientos de miles de librerías que los desarrolladores pueden descargar e integrar directamente en sus proyectos.

PyPI funciona como una gran base de datos donde se publican tanto herramientas generales como especializadas: desde librerías para ciencia de datos hasta frameworks web, módulos de seguridad, gráficos, automatización, inteligencia artificial o videojuegos.

📍 Sitio web oficial: 🔗 https://pypi.org

Ejemplo: búsqueda de paquetes​

En la web de PyPI se puede buscar cualquier librería usando palabras clave. Por ejemplo, si se introduce “data visualization”, aparecerán paquetes como matplotlib, seaborn o plotly.

Cada paquete cuenta con:

  • Una descripción del proyecto.
  • Su versión actual y versiones anteriores.
  • El nombre del autor o mantenedor.
  • Enlace al código fuente (normalmente en GitHub).
  • Instrucciones de instalación y ejemplos de uso.

🟦 Instalación de paquetes con pip​

pip es el gestor de paquetes oficial de Python, utilizado para descargar e instalar librerías desde PyPI o desde otros repositorios compatibles.

Instalación básica​

Para instalar un paquete se ejecuta el comando:

pip install nombre_paquete
pip install requests
en este ejemplo
  1. Se conecta a PyPI.
  2. Descarga la versión más reciente del paquete requests.
  3. Lo instala automáticamente en el entorno de Python actual.

Instalar una versión específica​

También se puede especificar una versión concreta del paquete:

pip install requests==2.31.0

Esto garantiza que se use una versión compatible con un proyecto determinado.

🟨 Actualizar o desinstalar un paquete​

Para actualizar un paquete a su versión más reciente:

pip install --upgrade requests

Y para desinstalarlo:

pip uninstall requests

🟧 Listar y verificar paquetes instalados​

Se pueden consultar los paquetes instalados en el entorno con:

pip list

Y comprobar si alguna versión está desactualizada con:

pip list --outdated

4️⃣ Uso de entornos virtuales​

Los entornos virtuales permiten aislar las dependencias de cada proyecto, evitando conflictos entre versiones de librerías. Son una práctica esencial cuando se trabaja con múltiples aplicaciones o en equipos de desarrollo.

🟩Creación de un entorno virtual​

Desde la terminal, ejecuta:

python -m venv entorno

Esto crea una carpeta llamada entorno que contiene una instalación independiente de Python.

Para activar el entorno:

  entorno\Scripts\activate

Una vez activado, cualquier paquete instalado con pip quedará limitado a ese entorno.

🟦 Desactivación del entorno​

Para volver al entorno global, simplemente ejecuta:

deactivate

🟨 Ventajas del uso de entornos virtuales​

VentajaDescripción
AislamientoCada proyecto tiene sus propias dependencias.
CompatibilidadPermite usar diferentes versiones del mismo paquete en proyectos distintos.
SeguridadEvita alterar la instalación global de Python.
ReproducibilidadFacilita la creación de entornos idénticos en otros equipos.

5️⃣ Creación y distribución de paquetes propios​

Además de instalar librerías, los desarrolladores pueden crear y publicar sus propios paquetes en PyPI. Este proceso permite compartir código con la comunidad o distribuir herramientas internas dentro de una organización.

El proceso general es:

  1. Crear un directorio con la estructura del paquete.

  2. Incluir un archivo setup.py o pyproject.toml con los metadatos.

  3. Generar los archivos de distribución:

    python setup.py sdist bdist_wheel
  4. Subirlos a PyPI con la herramienta twine:

    twine upload dist/*
aviso

Este proceso requiere una cuenta gratuita en https://pypi.org.