Saltar al contenido

python – Importación de archivos de diferentes carpetas

septiembre 24, 2021
apple touch icon@2

En Python 3.4 y posterior, puede importar desde un archivo fuente directamente (enlace a la documentación). Esta no es la solución más simple, pero incluyo esta respuesta para completar.

Aquí hay un ejemplo. Primero, el archivo que se va a importar, llamado foo.py:

def announce():
    print("Imported!")

El código que importa el archivo anterior, inspirado en gran medida en el ejemplo de la documentación:

import importlib.util

def module_from_file(module_name, file_path):
    spec = importlib.util.spec_from_file_location(module_name, file_path)
    module = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(module)
    return module

foo = module_from_file("foo", "/path/to/foo.py")

if __name__ == "__main__":
    print(foo)
    print(dir(foo))
    foo.announce()

La salida:

<module 'foo' from '/path/to/foo.py'>
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'announce']
Imported!

Tenga en cuenta que no es necesario que el nombre de la variable, el nombre del módulo y el nombre del archivo coincidan. Este código todavía funciona:

import importlib.util

def module_from_file(module_name, file_path):
    spec = importlib.util.spec_from_file_location(module_name, file_path)
    module = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(module)
    return module

baz = module_from_file("bar", "/path/to/foo.py")

if __name__ == "__main__":
    print(baz)
    print(dir(baz))
    baz.announce()

La salida:

<module 'bar' from '/path/to/foo.py'>
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'announce']
Imported!

La importación de módulos mediante programación se introdujo en Python 3.1 y le brinda más control sobre cómo se importan los módulos. Consulte la documentación para obtener más información.

close