Pregunta ¿Cómo importar un módulo dado el camino completo?


¿Cómo puedo cargar un módulo de Python dada su ruta completa? Tenga en cuenta que el archivo puede estar en cualquier lugar del sistema de archivos, ya que es una opción de configuración.


774
2017-09-15 22:30


origen


Respuestas:


Para el uso de Python 3.5+:

import importlib.util
spec = importlib.util.spec_from_file_location("module.name", "/path/to/file.py")
foo = importlib.util.module_from_spec(spec)
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).

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 compilados de Python y DLL.

Ver también. http://bugs.python.org/issue21436.


898
2017-09-15 22:41



La ventaja de agregar una ruta a sys.path (sobre el uso de imp) es que simplifica las cosas al importar más de un módulo de 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

307
2017-09-24 19:36



También puede hacer algo como esto y agregar el directorio en el que se encuentra el archivo de configuración a la ruta de carga de Python, y luego realizar una importación normal, asumiendo que conoce el nombre del archivo por adelantado, en este caso "config".

Desordenado, pero funciona.

configfile = '~/config.py'

import os
import sys

sys.path.append(os.path.dirname(os.path.expanduser(configfile)))

import config

17
2017-09-15 22:44



Puedes usar el

load_source(module_name, path_to_file) 

método de módulo imp.


16
2017-09-15 22:41



Parece que no desea importar específicamente el archivo de configuración (que tiene muchos efectos secundarios y complicaciones adicionales), solo desea ejecutarlo y poder acceder al espacio de nombres resultante. La biblioteca estándar proporciona una API específicamente para eso en la forma de runpy.run_path:

from runpy import run_path
settings = run_path("/path/to/file.py")

Esa interfaz está disponible en Python 2.7 y Python 3.2+


12
2018-05-20 06:52



def import_file(full_path_to_module):
    try:
        import os
        module_dir, module_file = os.path.split(full_path_to_module)
        module_name, module_ext = os.path.splitext(module_file)
        save_cwd = os.getcwd()
        os.chdir(module_dir)
        module_obj = __import__(module_name)
        module_obj.__file__ = full_path_to_module
        globals()[module_name] = module_obj
        os.chdir(save_cwd)
    except:
        raise ImportError

import_file('/home/somebody/somemodule.py')

10
2017-09-16 01:43



¿Te refieres a cargar o importar?

Puede manipular la lista sys.path, especifique la ruta a su módulo, luego importe su módulo. Por ejemplo, dado un módulo en:

/foo/bar.py

Podrías hacerlo:

import sys
sys.path[0:0] = '/foo' # puts the /foo directory at the start of your path
import bar

9
2017-09-15 22:46



Creo que puedes usar imp.find_module() y imp.load_module() para cargar el módulo especificado Deberá dividir el nombre del módulo de la ruta, es decir, si desea cargar /home/mypath/mymodule.py necesitarías hacer:

imp.find_module('mymodule', '/home/mypath/')

... pero eso debería hacer el trabajo.


8
2017-09-15 22:37



Aquí hay un código que funciona en todas las versiones de Python, de 2.7 a 3.5 y probablemente incluso en otras.

config_file = "/tmp/config.py"
with open(config_file) as f:
    code = compile(f.read(), config_file, 'exec')
    exec(code, globals(), locals())

Lo probé Puede ser feo, pero hasta ahora es el único que funciona en todas las versiones.


7
2018-06-03 10:04