¿Cómo puedo importar un módulo dinámicamente dada la ruta completa?
¿Cómo cargo un módulo de Python dada su ruta completa?
Tenga en cuenta que el archivo puede estar en cualquier parte del sistema de archivos donde el usuario tenga derechos de acceso.
Ver también: ¿ Cómo importar un módulo dado su nombre como cadena?
Tengamos MyClass
un module.name
módulo definido en /path/to/file.py
. A continuación se muestra cómo importamos MyClass
desde este módulo.
Para uso de Python 3.5+ ( docs ):
import importlib.util
import sys
spec = importlib.util.spec_from_file_location("module.name", "/path/to/file.py")
foo = importlib.util.module_from_spec(spec)
sys.modules["module.name"] = foo
spec.loader.exec_module(foo)
foo.MyClass()
Para Python 3.3 y 3.4 use:
from importlib.machinery import SourceFileLoader
foo = SourceFileLoader("module.name", "/path/to/file.py").load_module()
foo.MyClass()
(Aunque esto ha quedado obsoleto en Python 3.4).
Para uso de Python 2:
import imp
foo = imp.load_source('module.name', '/path/to/file.py')
foo.MyClass()
Existen funciones de conveniencia equivalentes para archivos DLL y archivos Python compilados.
Véase también http://bugs.python.org/issue21436 .
La ventaja de agregar una ruta a sys.path (en lugar de usar imp) es que simplifica las cosas al importar más de un módulo desde un solo paquete. Por ejemplo:
import sys
# the mock-0.3.1 dir contains testcase.py, testutils.py & mock.py
sys.path.append('/foo/bar/mock-0.3.1')
from testcase import TestCase
from testutils import RunTests
from mock import Mock, sentinel, patch