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
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:
- Desinstalación:
pip uninstall numpy -y - Limpieza de caché:
pip cache purge - 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_dirssolo 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:
Resultado:python -c "import numpy; print(f'NumPy {numpy.__version__} importado correctamente')"NumPy 2.3.5 importado correctamente✅ - Verificación de setup.py:
Resultado: No hay errores de importación ✅python -c "exec(open('setup.py').read().split('setup(')[0])" - Compilación: El script
rebuild_cpp.ps1ahora 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
- NumPy Documentation: Troubleshooting ImportError
- Python Packaging: Python Packaging User Guide
- Cython Documentation: Cython Documentation
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.)