Domanda

Sto cercando di caricare dinamicamente i moduli che ho creato.

In questo momento questo funziona correttamente:

import structures.index

Ma se provo la stessa cosa importando in modo dinamico, non riesce.

struct = __import__("structures.index")

Errore in dotazione è:

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

Tutte le idee perché?


Modifica: Quando si utilizza intero ambito (che genere di opere?):

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

Questo non genera errori, tuttavia, non sta caricando il modulo di indice, è il caricamento del modulo "neoform" invece.

Il risultato di "struct" è il seguente:

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

Inoltre, come una domanda lato, come posso poi istanziare una classe all'interno di un modulo caricato in modo dinamico? (Assumendo che tutti i moduli contengono un nome classe comune).

Modifica: Soluzione: (grazie coonj & Rick) Si è rivelato cosa ha funzionato. Non so perché (ancora), ma la fromlist doveva essere qualcosa di "qualsiasi cosa a quanto pare, dal momento che ha funzionato quando ho messo la lettera 'a' come valore (strano, visto che il file aveva solo 1 classe in esso).

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))
È stato utile?

Soluzione

Non sono sicuro di ciò che "fallisce" significa, quindi mi limiterò a ricordare che __import__('structures.index') dovrebbe, infatti, il lavoro, ma non assegnare il nome del modulo nell'ambito corrente. Per fare questo (e quindi utilizzare una classe nel modulo importato in modo dinamico), dovrete usare:

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

I dettagli completi su __import__ sono disponibili rel="noreferrer"> .

Modifica: (sulla base di domanda di modifica)

Per importare neoform.structures.index, e restituire il modulo index, si dovrebbe effettuare le seguenti operazioni:

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

Quindi, se si dispone di un elenco di nomi di pacchetti packages, è possibile importare i loro moduli index e un'istanza di qualche classe MyClass per ogni utilizzando il seguente codice:

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

Altri suggerimenti

Per importare sottomoduli, è necessario specificare loro nel ARG fromlist di __import__()
Fo esempio, l'equivalente di:

import structures.index

è:

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

Per fare questo in una mappa è un po 'più complicato ...

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

Per tali importazioni, si vorrebbe definire una nuova funzione per ottenere il sotto-modulo di index da ciascun modulo:

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

Ora, si può fare questo per ottenere i riferimenti a tutti i moduli di indice:

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

Inoltre, se si vuole afferrare sottomoduli che non sono denominati 'indice' allora si potrebbe fare questo:

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

Utilizza intero ambito ( "neoform.structures.index") con questo metodo di supporto.

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!

Perché mai si dovrebbe sostituire

import structures.index

con

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

Il primo (a) fabbrica, (b) è dinamica e (c) è supportato direttamente. Quale possibile utilizzo caso non v'è per la sostituzione facile da cambiare, fonte di solo testo con qualcosa di più complesso?

In breve: Non fare questo. Non ha alcun valore.


Modifica

Il "Sto ricevendo l'importazione da un database" è un nobile sforzo, ma ancora non sensibile. Cosa blocco di codice dipende da tali importazioni? Questo intero blocco di codice - le importazioni e tutto - è ciò che si desidera eseguire. Questo intero blocco di codice - importazioni, le dichiarazioni e tutto -. Dovrebbe essere un normale file vecchio modulo python

Importa quel blocco di codice dal file system. Utilizzare il database per identificare quale file, l'autore del file - tutto ciò che si desidera utilizzare il database per. Ma semplicemente importare ed eseguire il modulo modo più semplice possibile.

molto tardi post qui. Ma ero alla ricerca di questa domanda su google. Ho fatto qualche prova ed errore. Non sono sicuro se questo frammento aiuterà ma qui è. Usandolo per il sito Flask.

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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top