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.

¿Cómo se usa importlib para cargar el archivo __init__.py en la ruta de directorio especificada?

Tengo la siguiente estructura de directorios:

Sub
    trackers
        __init__.py

Dado:

bundle_path = "<path>/Sub"

Quiero usar import lib para cargar el archivo __init__.py desde trackers. Soy consciente de que puedo mover archivos para solucionar mi problema y tener otra estructura de archivos, pero mi objetivo es hacer una importación dinámica, no explícita.

He intentado varias variaciones de spec_from_file_location, pero parece que no se le asigna un cargador.

¿Hay una forma recomendada?

Lo siguiente no funciona:

spec = util.spec_from_file_location('init', self.bundle_path.joinpath('trackers'))
module = util.module_from_spec(spec)
spec.loader.exec_module(module)

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para cargar el archivo __init__.py desde el directorio trackers utilizando importlib, puedes utilizar el siguiente código:

    import importlib.util
    
    bundle_path = "<path>/Sub"
    module_dir = bundle_path + "/trackers"
    module_name = "__init__"
    
    spec = importlib.util.spec_from_file_location(module_name, module_dir + "/" + module_name + ".py")
    module = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(module)
    

    Este código primero crea variables para la ruta del paquete, el directorio del módulo y el nombre del módulo. Luego, utiliza importlib.util.spec_from_file_location() para crear un objeto de especificación de módulo para el archivo __init__.py. Este método toma dos argumentos: el nombre del módulo y la ruta al archivo del módulo.

    Luego, utiliza importlib.util.module_from_spec() para crear un objeto de módulo vacío basado en el objeto de especificación. Finalmente, utiliza spec.loader.exec_module() para ejecutar el módulo y poblarlo con el contenido del archivo.

    Con este código, puedes importar dinámicamente el archivo __init__.py desde el directorio trackers sin necesidad de cambiar la estructura de archivos.

Comments are closed.