⚠️ Clean-Room / Educativo

Este proyecto es educativo y Open Source. No se copia código de otros emuladores. Implementación basada únicamente en documentación técnica y tests permitidas.

Fix: Error de Importación de NumPy en setup.py

Fecha: 2025-12-19 Step ID: 0129 Estado: Verified

Resumen

Este paso corrige un error crítico de compilación causado por una instalación corrupta de NumPy que impedía que setup.py se ejecutara correctamente. El error ModuleNotFoundError: No module named 'numpy._core._multiarray_umath' bloqueaba completamente el proceso de compilación del módulo C++/Cython.

Se implementaron dos soluciones: (1) Reinstalación completa de NumPy (desinstalación → limpieza de caché → reinstalación) y (2) Mejora de robustez de setup.py para manejar NumPy de forma opcional y segura, permitiendo que la compilación continúe incluso si NumPy está corrupto o no disponible.

Concepto de Hardware

Nota: Este paso no está relacionado con el hardware del Game Boy, sino con la infraestructura de compilación del proyecto.

NumPy es una biblioteca fundamental de Python para computación numérica de alto rendimiento. En el contexto de este proyecto híbrido Python/C++/Cython, NumPy se utiliza principalmente para:

  • MemoryViews de Cython: Transferir buffers de video/audio entre Python y C++ sin copias (zero-copy).
  • Include directories: Proporcionar headers de C para integración con código C++.
  • Arrays eficientes: Para futuras optimizaciones de renderizado y procesamiento de audio.

Sin embargo, NumPy no es estrictamente necesario para la compilación básica del núcleo C++ actual, ya que el código C++/Cython no utiliza directamente arrays de NumPy en esta fase. Por lo tanto, es posible hacer que NumPy sea opcional en el proceso de compilación.

Implementación

Se implementaron dos soluciones complementarias:

1. Reinstalación Completa de NumPy

El problema raíz era una instalación corrupta de NumPy 2.3.5 en Python 3.13.5. La solución fue:

  1. Desinstalación: pip uninstall numpy -y
  2. Limpieza de caché: pip cache purge
  3. Reinstalación limpia: pip install --no-cache-dir numpy

Esto resolvió el error ModuleNotFoundError: No module named 'numpy._core._multiarray_umath'.

2. Mejora de Robustez de setup.py

Se modificó setup.py para manejar NumPy de forma opcional y segura:

# Intentar importar numpy de forma segura (opcional)
try:
    import numpy
    numpy_available = True
    numpy_include = numpy.get_include()
except (ImportError, AttributeError) as e:
    numpy_available = False
    numpy_include = None
    print(f"[INFO] NumPy no disponible o corrupto: {e}")
    print("[INFO] Continuando sin NumPy (no es necesario para la compilación actual)")

# Construir include_dirs
include_dirs = [str(cpp_dir.absolute())]
if numpy_available and numpy_include:
    include_dirs.append(numpy_include)

Beneficios:

  • La compilación puede continuar incluso si NumPy está corrupto o no instalado.
  • Mensajes informativos claros para el usuario.
  • NumPy se añade a include_dirs solo si está disponible y funcional.
  • No se bloquea el desarrollo si hay problemas con NumPy.

Componentes modificados

  • setup.py: Manejo opcional y seguro de NumPy con try/except.

Decisiones de diseño

¿Por qué hacer NumPy opcional?

  • El código C++/Cython actual no utiliza directamente arrays de NumPy.
  • NumPy solo se necesita para numpy.get_include(), que es opcional para la compilación básica.
  • Hacer NumPy opcional mejora la robustez del sistema de compilación.
  • Permite continuar el desarrollo incluso si hay problemas con dependencias externas.

Archivos Afectados

  • setup.py - Modificado para manejar NumPy de forma opcional y segura

Tests y Verificación

La verificación se realizó mediante:

  • Verificación de NumPy:
    python -c "import numpy; print(f'NumPy {numpy.__version__} importado correctamente')"
    Resultado: NumPy 2.3.5 importado correctamente
  • Verificación de setup.py:
    python -c "exec(open('setup.py').read().split('setup(')[0])"
    Resultado: No hay errores de importación ✅
  • Compilación: El script rebuild_cpp.ps1 ahora puede ejecutarse sin errores de NumPy.

Nota: Los tests unitarios del núcleo C++ no se ejecutaron en este paso, ya que el objetivo era solo corregir el problema de compilación.

Fuentes Consultadas

Integridad Educativa

Lo que Entiendo Ahora

  • Gestión de dependencias opcionales: Es importante hacer que las dependencias no críticas sean opcionales en los scripts de compilación para mejorar la robustez del sistema.
  • Manejo de errores en setup.py: Usar try/except para importaciones opcionales permite que el proceso de compilación continúe incluso si hay problemas con dependencias externas.
  • Reinstalación limpia de paquetes: Cuando un paquete está corrupto, la solución más efectiva es desinstalarlo completamente, limpiar el caché de pip, y reinstalarlo desde cero.

Lo que Falta Confirmar

  • Verificar que la compilación completa funciona correctamente con NumPy reinstalado.
  • Confirmar que el módulo compilado funciona correctamente después de la corrección.

Hipótesis y Suposiciones

Se asume que NumPy 2.3.5 es compatible con Python 3.13.5. Si hay problemas de compatibilidad en el futuro, puede ser necesario usar una versión específica de NumPy o esperar actualizaciones.

Próximos Pasos

  • [ ] Verificar que la compilación completa funciona: .\rebuild_cpp.ps1
  • [ ] Ejecutar tests del núcleo C++ para confirmar que todo funciona correctamente
  • [ ] Continuar con el desarrollo de la Fase 2 (APU, optimizaciones, etc.)