¿Cómo puedo importar un módulo dinámicamente dada la ruta completa?

Resuelto derfred asked hace 16 años • 38 respuestas

¿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?

derfred avatar Sep 16 '08 05:09 derfred
Aceptado

Tengamos MyClassun module.namemódulo definido en /path/to/file.py. A continuación se muestra cómo importamos MyClassdesde 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 .

Sebastian Rittau avatar Sep 15 '2008 22:09 Sebastian Rittau

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
Daryl Spitzer avatar Sep 24 '2008 19:09 Daryl Spitzer