Pregunta

Estoy tratando de cargar dinámicamente módulos que he creado.

En este momento esto funciona correctamente:

import structures.index

Pero si intento lo mismo mediante la importación de forma dinámica, falla.

struct = __import__("structures.index")

Error suministrado es:

Error ('No module named structures.index',)

Cualquier idea por qué?


Edit: Cuando se utiliza alcance completo (que tipo de obras?):

struct = __import__("neoform.structures.index")

Esto no lanza ningún error, sin embargo, no se carga el módulo de índice, se carga el módulo "neoform" en su lugar.

El resultado de la "estructura" es:

<module 'neoform' from '/neoform/__init__.py'>

Además, como una cuestión lado, ¿cómo puedo entonces una instancia de una clase dentro de un módulo de carga dinámica? (Suponiendo que todos los módulos contienen un nombre de clase común).

Editar: Solución: (gracias coonj y Rick) Esto terminó siendo lo que funcionó. No sé por qué (aún), pero el fromlist tenía que ser algo "nada, aparentemente, ya que trabajó cuando pongo la letra 'a' como un valor (extraño, teniendo en cuenta que el archivo sólo tenía 1 clase en ella).

def get_struct_module(self, name):
    try:
        return = __import__("neoform.structures." + name, fromlist='*')
    except ImportError, e:
        self.out.add("Could not load struct: neoform.structure." + name + "\n\n" + "Error " + str(e.args))
¿Fue útil?

Solución

No estoy seguro de lo que "no" significa, así que voy a mencionar que __import__('structures.index') debe, de hecho, el trabajo, pero no asignar el nombre del módulo en el ámbito actual. Para hacer eso (y luego utilizar una clase en el módulo dinámicamente importado), usted tiene que utilizar:

structures = __import__('structures.index')
structures.index.SomeClass(...)

Los detalles completos sobre __import__ están disponibles rel="noreferrer"> .

Editar: (basado en cuestión de edición)

Para importar neoform.structures.index, y regresar el módulo index, tendría que hacer lo siguiente:

structures = __import__('neoform.structures.index', 
                        fromlist=['does not in fact matter what goes here!'])

Así que si usted tiene una lista de nombres de paquetes packages, puede importar sus módulos index y crear instancias de una clase para cada MyClass usando el siguiente código:

modules = [ __import__('neoform.%s.index' % pkg, fromlist=['a']) 
            for pkg in packages ]
objects = [ m.MyClass() for m in modules ]

Otros consejos

Para importar sub-módulos, es necesario especificar en el arg fromlist de __import__()
Fo ejemplo, el equivalente a:

import structures.index

es:

structures = __import__('structures', fromlist=['index'])

Para hacer esto en un mapa es un poco más complicado ...

import mod1.index
import mod2.index
import mod3.index

Para esas importaciones, que se quiere definir una nueva función para obtener el submódulo index de cada módulo:

def getIndexMods(mod_names):
  mod_list = map(lambda x: __import__(x, fromlist='index'))
  index_mods = [mod.index for mod in mod_list]
  return index_mods

Ahora, usted puede hacer esto para conseguir las referencias a todos los módulos de índice:

index_mods = getIndexMods(['mod1', 'mod2', 'mod3'])

Además, si quieres tomar sub-módulos que no son nombrados 'índice' entonces se podría hacer esto:

mod1, mod2, mod3 = map(lambda x,y: __import__(x, fromlist=y), 
  ['mod1', 'mod2', 'mod3'], ['index1', 'index2', 'index3'])

Utilice alcance completo ( "neoform.structures.index") con este método de ayuda.

def import_module(name):
    mod = __import__(name)
    components = name.split('.')
    for comp in components[1:]:
        mod = getattr(mod, comp)
    return mod

module = import_module("neoform.structures.index")
# do stuff with module
>>> import imp
>>> fm = imp.find_module('index', ['./structures']) # for submodule
>>> mymod = imp.load_module('structures.index', *fm)
>>> mymod
<module 'structures.index' from './structures/index.pyc'>
>>> x = mymod.insideIndex()
Initialising index class...

Voila!

¿Por qué en la tierra le sustituya

import structures.index

con

map(__import__, ["structures.index"])

El primero (a) funciona, (b) es dinámico y (c) está soportado directamente. ¿Qué posible uso no es el caso para la sustitución fácil de cambiar, fuente de texto plano con algo más complejo?

En pocas palabras: no hacen esto. No tiene ningún valor.


Editar

El "yo estoy haciendo la importación de una base de datos" es un noble esfuerzo, pero todavía no sensible. Lo bloque de código depende de las importaciones? Todo ese bloque de código - importaciones y todo - es lo que se desea ejecutar. Todo ese bloque de código - las importaciones, las declaraciones y todo -. debe ser un archivo viejo y simple módulo de Python

Importar ese bloque de código del sistema de archivos. Utilice la base de datos para identificar el archivo, el autor del archivo - cualquier cosa que desee utilizar la base de datos. Sino simplemente importar y ejecutar el módulo de la forma más sencilla posible.

muy tarde post aquí. Pero yo estaba buscando esta pregunta en Google. Hice un poco de ensayo y error. No estoy seguro si este fragmento le ayudará, pero aquí está. Usarlo para Frasco sitio.

modules = ['frontend', 'admin']
for module in modules:
    mod = __init__('controllers.%s' % module, fromlist=[module])
    app.register_blueprint(mod.blueprint_mod)


# or
from importlib import import_module
modules = ['frontend', 'admin']
for module in modules:
    mod = import_module('controllers.%s' % module)
    app.regitster_blueprint(mod.blueprint_mod)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top