2010-07-15 6 views
17

In Ruby statt Wiederholung des "require" (die "Import" in Python) Wort viele Male, ichWie werden mehrere Importe in Python durchgeführt?

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

So durchläuft es den Satz von "Libs" über und "require" (Import) jeder von Ihnen. Jetzt schreibe ich ein Python-Skript und möchte so etwas machen. Gibt es einen Weg, oder muss ich "Import" für alle von ihnen schreiben?

Die direkte "Traduction" wäre so etwas wie der folgende Code. Wie auch immer, da Python keine libs namens strings importiert, funktioniert es nicht.

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

Vielen Dank im Voraus

+1

Python hat tatsächlich eine eingebaute Funktion haben [ '__import__'] (http://docs.python.org/library/functions.html#__import__), die Sie importieren können ein Modul, das in einer Zeichenfolge benannt ist. Aber es soll von der Implementierung der 'import'-Anweisung aufgerufen werden, nicht vom Benutzercode. Das wäre in diesem Fall sicherlich nicht die richtige Lösung. –

+0

Oh! Wirklich danke für alle Antworten. Sehr gut alle von ihnen. – Eduardo

Antwort

26

Für bekannte Modul, trennen Sie diese einfach durch ein Komma:

import lib1, lib2, lib3, lib4, lib5 

Wenn Sie wirklich programmatisch importieren müssen, basierend auf dynamische Variablen, eine wörtliche Übersetzung des Rubin wäre:

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

Obwohl dies in Ihrem Beispiel nicht nötig ist.

12

Versuchen Sie folgendes:

import lib1, lib2, lib3, lib4, lib5 

Sie können auch den Namen ändern sie unter auf diese Weise eingeführt werden, etwa so:

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

Sie können aus einer Zeichenfolge, die Ihren Modulnamen enthält, mit der Funktion __import__ importieren.

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

Sie können __import__ verwenden, wenn Sie eine Liste von Strings, die Module darstellen, aber es ist wahrscheinlich sauberer, wenn Sie den Hinweis in der Dokumentation folgen und importlib.import_module direkt:

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

Sie haben nicht die importierte Bibliotheken als Variablen zur Verfügung diese Weise aber Sie sie durch das imported_libs Wörterbuch zugreifen konnte:

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

Sie könnten auch sie Ihre globals und aktualisieren Sie dann verwenden, wie sie waren Bedeu ted "normal":

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