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.
Sie können die Funktion __import__()
wie folgt verwenden:
Sie können auch imp.find_module
verwenden, um zu bestimmen, ob ein Modul gefunden werden kann ohne es importieren ::
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:
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.
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. __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.
Tags und Links python reflection module import python-module