Estoy trabajando en pypreprocessor que es un preprocesador que toma directivas c-style y pude hacer que funcione como un preprocesador tradicional (es autoconsciente y ejecuta código posprocesado sobre la marcha) excepto que rompe las importaciones de la biblioteca.¿Cómo anulo una importación de Python?
El problema es que el preprocesador se ejecuta en el archivo, lo procesa, genera en un archivo temporal y exec() el archivo temporal. Las bibliotecas que se importan deben manejarse un poco diferente, porque no se ejecutan, sino que se cargan y se vuelven accesibles para el módulo llamante.
Lo que necesito hacer es: Interrumpir la importación (ya que el preprocesador se está ejecutando en el medio de la importación), cargar el código posprocesado como tempModule y reemplazar la importación original con tempModule para engañar el script de llamada con la importación para creer que el tempModule es el módulo original.
He buscado en todas partes y hasta ahora y no tengo solución.
pregunta Este desbordamiento de pila es el más cercano que he visto en lo que va a proporcionar una respuesta: Override namespace in Python
Esto es lo que tengo.
# Remove the bytecode file created by the first import
os.remove(moduleName + '.pyc')
# Remove the first import
del sys.modules[moduleName]
# Import the postprocessed module
tmpModule = __import__(tmpModuleName)
# Set first module's reference to point to the preprocessed module
sys.modules[moduleName] = tmpModule
ModuleName es el nombre del módulo original, y tmpModuleName es el nombre del archivo de código posprocesamiento.
La parte extraña es que esta solución todavía se ejecuta completamente normal como si el primer módulo completo se cargara normalmente; a menos que elimines la última línea, obtienes un error de módulo no encontrado.
Esperemos que alguien en Stack Overflow sepa mucho más sobre las importaciones que yo, porque esta me tiene perplejo.
Nota: Solo otorgaré una solución o, si esto no es posible en Python; la mejor y más detallada explicación de por qué esto no es imposible.
Actualización: Para cualquiera que esté interesado, aquí está el código de trabajo.
if imp.lock_held() is True:
del sys.modules[moduleName]
sys.modules[tmpModuleName] = __import__(tmpModuleName)
sys.modules[moduleName] = __import__(tmpModuleName)
La parte 'imp.lock_held' detecta si el módulo está siendo cargado como una biblioteca. Las siguientes líneas hacen el resto.
Usted está escribiendo un preprocesador, debe analizar los archivos antes de compilarlos. Es decir. deberías poder cambiar el 'módulo de importación' en' importación post_processed_module' antes de que el tiempo de ejecución de python cargue tu archivo, analizando el código fuente, modificándolo y colocándolo en un archivo. Después de preprocesar todo el árbol de origen _then_, puede ejecutar() el archivo raíz procesado posteriormente. – Iacopo
@lacopo Desafortunadamente, el preprocesador debe importarse en el archivo que está preprocesando. Es una especie de importación, las directivas de preprocesador y preprocesador funcionarán en este archivo. ES DECIR. es autoconsumo –