Testen Sie, ob Python-Modulabhängigkeiten installiert sind

7

Wie könnte man testen, ob eine Reihe von Modulen installiert ist, wenn man die Namen der Module angibt. ZB

%Vor%

Es ist zwar möglich, die Tests folgendermaßen auszugeben:

%Vor%

Das ist ein bisschen umständlich für das, was ich mache. Gibt es einen dynamischen Weg, dies zu tun?

Ich habe versucht, eval ("import% s"% -Modul), aber das beschwerte sich über einen Kompilierfehler.

Ich bin dankbar für Ihre Gedanken und Vorschläge. Danke.

    
Brian M. Hunt 20.04.2009, 14:27
quelle

4 Antworten

8

Sie können die Funktion __import__() wie folgt verwenden:

%Vor%

Sie können auch imp.find_module verwenden, um zu bestimmen, ob ein Modul gefunden werden kann ohne es importieren ::

%Vor%

Oh, und Sie können eval() nicht verwenden, weil import eine Anweisung und kein Ausdruck ist. Du kannst exec verwenden, wenn du wirklich willst, obwohl ich es nicht empfehlen würde:

%Vor%     
Rick Copeland 20.04.2009, 14:43
quelle
6

Was ist daran falsch?

%Vor%

Das obige Beispiel verwendet die Funktion __import__ . Außerdem testet es streng, ob es existiert oder nicht - es speichert den Import nicht irgendwo, aber Sie können ihn leicht ändern, um das zu tun.

    
Paolo Bergantino 20.04.2009 14:31
quelle
5

Es lohnt sich, die Kompromisse zwischen dem find_module-Ansatz und dem __import__ -Ansatz zu verstehen:

  • __import__('foo') löst beim Laden des Moduls irgendwelche Nebeneffekte aus, unabhängig davon, ob Sie einen Verweis auf das importierte Modul speichern. Das könnte OK sein oder nicht.
  • find_module('foo') löst keine Nebenwirkungen aus, sollte also immer sicher sein.
  • keiner der beiden Ansätze funktioniert gut, wenn das Modul gefunden wurde, hat aber andere Probleme beim Laden (z. B. SyntaxError, NameError, ...)
  • Je nachdem, wie Sie mit Fehlern umgehen, führt das Umschließen von __import__('foo') in einem try / except zu irreführenden Ergebnissen, wenn foo gefunden wird, aber foo importiert die Leiste, die nicht gefunden wird.
  • find_module() kann mit Punktnamen nicht umgehen. Wenn Sie also prüfen müssen, ob 'foo.bar.bat.baz' importiert werden kann, müssen Sie mehrere Aufrufe von find_module und load_module gemäß dem docs.
slinkp 14.07.2010 16:05
quelle
2
%Vor%     
vartec 20.04.2009 14:43
quelle