es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  ,

Answer

  1. Avatar for 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:

    1. Asegúrese de que su fuente empaquetada esté estructurada correctamente y se pueda instalar como un paquete separado. Esto significa que su paquete debe tener un archivo setup.py válido y una estructura de directorios.
    2. Instale el paquete usando pip. Esto asegurará que el paquete esté disponible en el entorno de Python.

    3. 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:

    import importlib
    
    AdminApi = importlib.import_module('your_package.AdminApi').AdminApi
    

    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.

Comments are closed.