Importando módulo dinámicamente en Python3 – problema
En un proyecto, quiero importar dinámicamente el módulo correcto basado en un número de versión.
Para esto estoy usando importlib, y funciona bien siempre y cuando el paquete sea parte de la fuente.
La estructura de carpetas es la siguiente:
Admin-Package /
- __init__.py # Contiene el cargador dinámico de clases
- admin64/
- __init__.py # contiene AdminApi v6.4
- ...
- admin65/...
- __init__.py # contiene AdminApi v6.5
- ...
Sin embargo, ahora me encuentro necesitando desacoplar el código en su propio paquete para reutilizarlo en otro proyecto. Por lo tanto, he empaquetado esta parte de la fuente. Esto parece causar problemas relacionados con la ruta. Esto parece significar que importlib no puede ayudarme.
Hasta ahora, gracias a: https://stackoverflow.com/a/54138717/5731101
He llegado a este punto:
import importlib
from pathlib import Path
path = Path(<strong>archivo</strong>).resolve().parent
script_path = os.path.join(path, version, '<strong>init</strong>.py')
spec = importlib.util.spec_from_file_location(f"AdminApi", script_path)
AdminApi = importlib.util.module_from_spec(spec)
spec.loader.exec_module(AdminApi)
Desafortunadamente spec.loader.exec_module
falla con el error: ModuleNotFoundError: No module named 'AdminApi'
A pesar de que la clase está claramente disponible en el archivo suministrado a través de la ruta.
Agradecería si alguien puede ayudarme en esto.
davy.ai
Parece que la carga dinámica de clases utilizando importlib tiene problemas al intentar importar un módulo desde una fuente empaquetada.
Para resolver esto, puede intentar los siguientes pasos:
setup.py
válido y una estructura de directorios.Instale el paquete usando pip. Esto asegurará que el paquete esté disponible en el entorno de Python.
En su script principal, importe el módulo necesario utilizando
importlib.import_module()
. Por ejemplo, si tiene un módulo llamado “AdminApi” en su paquete, puede importarlo de la siguiente manera:Asegúrese de reemplazar “your_package” con el nombre real de su paquete.
Esto debería importar dinámicamente el módulo correcto basándose en el número de versión y debería funcionar incluso si el paquete es parte de una fuente o se instala como un paquete separado.