2010-07-15 10 views
17

En Ruby, au lieu de répéter le « besoin » (la « importation » en Python) beaucoup de mots de fois, jeComment faire plusieurs imports en Python?

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

Il parcourt l'ensemble des « libs » et « exiger » (importation) chacun d'entre eux. Maintenant, j'écris un script Python et j'aimerais faire quelque chose comme ça. Y at-il un moyen de, ou ai-je besoin d'écrire "importer" pour chacun d'eux.

La "traduction" simple serait quelque chose comme le code suivant. Quoi qu'il en soit, Python n'important pas de libs nommées comme des chaînes, cela ne fonctionne pas.

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

Merci à l'avance

+1

Python réellement a une fonction intégrée [ '__import__'] (http://docs.python.org/library/functions.html#__import__) que vous pouvez utiliser pour importer un module nommé dans une chaîne. Mais il doit être appelé à partir de l'implémentation de l'instruction 'import', pas du code utilisateur. Ce ne serait certainement pas la solution appropriée dans ce cas. –

+0

Oh! Vraiment merci pour toutes les réponses. Très bien tous. – Eduardo

Répondre

26

Pour le module connu, il suffit de les séparer par des virgules:

import lib1, lib2, lib3, lib4, lib5 

Si vous avez vraiment besoin d'importer par programmation en fonction des variables dynamiques, une traduction littérale de votre rubis serait:

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

Bien que cela ne soit pas nécessaire dans votre exemple.

12

Essayez ceci:

import lib1, lib2, lib3, lib4, lib5 

Vous pouvez également modifier le nom de leur importation en vertu de cette manière, comme ceci:

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

Vous pouvez importer à partir d'une chaîne qui contient le nom de votre module en utilisant la fonction __import__.

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

Vous pouvez utiliser __import__ si vous avez une liste de chaînes qui représentent des modules, mais il est probablement plus propre si vous suivez l'indication dans la documentation et utiliser importlib.import_module directement:

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

Vous n'avez pas importé bibliothèques comme variables disponibles de cette façon mais vous pouvez y accéder via le dictionnaire imported_libs:

>>> 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 

vous pouvez également mettre à jour votre globals et les utiliser comme ils étaient impor ted "normalement":

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