2011-06-05 22 views
8

Encontré this, pero eso no es todo lo que quiero hacer.Importar todas las clases en el directorio?

Quiero importar todas las clases en todos los archivos de un directorio. Básicamente, quiero reemplazar esto:

from A import * 
from B import * 
from C import * 

Con algo dinámico, por lo que no tengo a mantener la edición de mi __init__.py cada vez que agregar otro archivo.


La solución glob parece ser el equivalente de

import A 
import B 
import C 

que no es el mismo en todos.

+0

¿Qué desea lograr con esto? –

+0

Y qué pasa con esta respuesta: http://stackoverflow.com/questions/1057431/loading-all-modules-in-a-folder-in-python/1057534#1057534? – viraptor

+0

@Ignacio: última oración. Tengo alrededor de 15 modelos, y todos deben importarse, siempre. No tiene sentido que tenga que seguir actualizando '__init __. Py' cuando esto se puede hacer programáticamente. – mpen

Respuesta

6

Puede hacer algo como esto, aunque tenga en cuenta que isinstance(cls, type) solo funciona con clases de estilo nuevo.

import os, sys 

path = os.path.dirname(os.path.abspath(__file__)) 

for py in [f[:-3] for f in os.listdir(path) if f.endswith('.py') and f != '__init__.py']: 
    mod = __import__('.'.join([__name__, py]), fromlist=[py]) 
    classes = [getattr(mod, x) for x in dir(mod) if isinstance(getattr(mod, x), type)] 
    for cls in classes: 
     setattr(sys.modules[__name__], cls.__name__, cls) 
+2

Sí, vi esa respuesta, no funciona. Importa los módulos, pero no las clases. Tendría que acceder al archivo como 'address.Address' mientras que necesito poder acceder con' Address'. Hay una diferencia – mpen

+0

Debe usar 'os.path.join (os.path.dirname (__ file__), '* .py')' en lugar de 'os.path.dirname (__ file__) +"/*. Py "'. –

+0

@Mark Ajustó mi respuesta para reflejar eso. – zeekay

Cuestiones relacionadas