2010-07-15 14 views
17

En Ruby, en vez de repetir el "requerir" (la "importación" en Python) un montón de palabras de veces, lo hago¿Cómo hacer múltiples importaciones en Python?

%w{lib1 lib2 lib3 lib4 lib5}.each { |x| require x } 

Así que itera sobre el conjunto de "libs" y "requieren" (importación) cada uno de ellos. Ahora estoy escribiendo un script de Python y me gustaría hacer algo así. ¿Hay alguna manera de, o debo escribir "importar" para todos ellos?

La "traducción" directa sería algo así como el siguiente código. De todos modos, dado que Python no importa libs denominadas cadenas, no funciona.

requirements = [lib1, lib2, lib3, lib4, lib5] 
for lib in requirements: 
    import lib 

Gracias de antemano

+1

Python en realidad tiene una función incorporada [ '__import__'] (http://docs.python.org/library/functions.html#__import__), que se puede utilizar para la importación un módulo nombrado en una cadena. Pero debe ser llamado desde la implementación de la declaración 'import', no desde el código de usuario. Ciertamente no sería la solución adecuada en este caso. –

+0

¡Oh! Realmente gracias por todas las respuestas. Muy bien todos ellos. – Eduardo

Respuesta

26

Para el módulo conocido, simplemente separarlos por comas:

import lib1, lib2, lib3, lib4, lib5 

Si realmente necesita importar basada programación de variables dinámicas, una traducción literal de su rubí sería:

modnames = "lib1 lib2 lib3 lib4 lib5".split() 
for lib in modnames: 
    globals()[lib] = __import__(lib) 

Aunque no hay necesidad de esto en su ejemplo.

12

Prueba esto:

import lib1, lib2, lib3, lib4, lib5 

También puede cambiar el nombre que se importan bajo de esta manera, así:

import lib1 as l1, lib2 as l2, lib3, lib4 as l4, lib5 
4

Puede importar desde una cadena que contenga su nombre de módulo utilizando la función __import__.

requirements = [lib1, lib2, lib3, lib4, lib5] 
for lib in requirements: 
    x = __import__(lib) 
1

Puede utilizar __import__ si usted tiene una lista de cadenas que representan los módulos, pero es probable que sea más limpia si se sigue la pista en la documentación y el uso importlib.import_module directamente:

import importlib 
requirements = [lib1, lib2, lib3, lib4, lib5] 
imported_libs = {lib: importlib.import_module(lib) for lib in requirements} 

Usted no tiene la importada bibliotecas como variables disponibles de esta forma, pero se podía acceder a ellos a través de la imported_libs diccionario:

>>> requirements = ['sys', 'itertools', 'collections', 'pickle'] 
>>> imported_libs = {lib: importlib.import_module(lib) for lib in requirements} 
>>> imported_libs 
{'collections': <module 'collections' from 'lib\\collections\\__init__.py'>, 
'itertools': <module 'itertools' (built-in)>, 
'pickle': <module 'pickle' from 'lib\\pickle.py'>, 
'sys': <module 'sys' (built-in)>} 

>>> imported_libs['sys'].hexversion 
50660592 

también podría actualizar su globals y luego usarlos como si fueran impor Ted "normalmente":

>>> globals().update(imported_libs) 
>>> sys 
<module 'sys' (built-in)> 
Cuestiones relacionadas