2010-08-31 19 views

Respuesta

17

desea

my_function = getattr(__import__('my_apps.views'), 'my_function') 

Si por casualidad usted conoce el nombre de la función en tiempo de compilación, se puede acortar este a

my_function = __import__('my_apps.views').my_function 

Esto cargará my_apps.views y luego asignará su atributo my_function al my_function local.

Si está seguro de que solo desea una función, entonces esto es aceptable. Si desea más de un atributo, puede hacerlo:

views = __import__('my_apps.views') 
my_function = getattr(views, 'my_function') 
my_other_function = getattr(views, 'my_other_function') 
my_attribute = getattr(views, 'my_attribute') 

ya que es más fácil de leer y le ahorra algunas llamadas a __import__. nuevamente, si conoce los nombres, el código se puede acortar como se indica arriba.

También puede hacerlo con las herramientas del módulo imp, pero es más complicado.

+2

habrá problemas (AttributeError) con las declaraciones anteriores __import__. Import devuelve el primer módulo (my_apps) a menos que se especifique una lista de importación. Necesitas algo como: 'my_function = __import __ ('my_apps.views', globals(), locals(), ['my_function']). My_function' Ver [python doc about __import__] (https: //docs.python .org/2/library/functions.html #__ import__) – marco

+0

¡La solución publicada por marco funciona para mí! Gracias – giopromolla

+0

Para mí, esto intenta importar la función de 'my_apps' en lugar de' my_apps.views'. – oarfish

5

Tenga en cuenta que Python 2.7 añaden los importlib module, envoltorios de conveniencia para __import__() y backport de 3,1 característica.

Este módulo es un subconjunto menor de lo que está disponible en el paquete más completo con el mismo nombre de Python 3.1 que proporciona una implementación completa de la importación. Lo que está aquí se ha proporcionado para facilitar la transición de 2.7 a 3.1.

importlib.import_module(name, package=None)

importar un módulo. El argumento de nombre especifica qué módulo importar en términos absolutos o relativos (por ejemplo, pkg.mod o ..mod). Si el nombre se especifica en términos relativos, entonces el argumento del paquete debe especificarse para el paquete que debe actuar como el anclaje para resolver el nombre del paquete (por ejemplo, import_module ('.. mod', 'pkg.subpkg') importará el paquete .mod). El módulo especificado se insertará en sys.modules y se devolverá.

+0

El subconjunto de importlib disponible en Python 2.7 también está disponible en PyPI y se backported allí para trabajar con Python 2.3 y posterior. –

1

acaba de escribir este código y parece lo que mucha gente necesita, por lo que incluso si más tarde lo muestro

def my_import(module_name,func_names = [],cache = False): 
    if module_name in globals() and cache: 
     return True 
    try: 
     m = __import__(module_name, globals(), locals(), func_names, -1) 
     if func_names: 
      for func_name in func_names: 
       globals()[func_name] = getattr(m,func_name) 
     else: 
      globals()[module_name] = m 
     return True 
    except ImportError: 
     return False 
def my_imports(modules): 
    for module in modules: 
     if type(module) is tuple: 
      name = module[0] 
      funcs = module[1] 
     else: 
      name = module 
      funcs = [] 
     if not my_import(name, funcs): 
      return module 
    return '' 

def checkPluginsImports(plugin,modules): 
    c = my_imports(modules) 
    if c: 
     print plugin +" has errors!: module '"+c+"' not found" 

# example: file test.py with "x" function 
def d(): 
    checkPluginsImports('demoPlugin',[('test',['x'])]) 

d() 
x() 
0
def import_by_string(full_name): 
    module_name, unit_name = full_name.rsplit('.', 1) 
    return getattr(__import__(module_name, fromlist=['']), unit_name) 


exists = import_by_string("os.path.exists") 
+0

Desde la versión 2.4 (desde 2004), Python ha tenido la función 'rsplit()', es mucho más eficiente hacer 'module_name, unit_name = full_name.rsplit ('.', 1)', que lo que estás haciendo. – Anthon

+0

Gracias. No lo pensé – Archibald

Cuestiones relacionadas