So überprüfen Sie Submodule in Python mit hasattr
Frage
Zur Laufzeit erhält der Python-Code den Namen eines zu ladenden Submoduls, das ich vorher nicht kenne.Jetzt möchte ich überprüfen, ob dieses Submodul in einem vorhandenen Modul vorhanden ist.Betrachten Sie diese Struktur, wo foo
und bar
kann angegeben werden:
master/
|
|- __init__.py
|
|- foo/
| |
| |- __init__.py
|
|- bar/
|
|- __init__.py
Normalerweise mache ich das jetzt, was für Defs und Variablen funktioniert:
import master
unknown_submodule = "foo"
if hasattr(master, unknown_submodule):
pass # all's well
oder ich fange den AttributeError , der genauso funktioniert.
Mit der obigen Dateistruktur kann ich diesen Ansatz jedoch nicht zum Laufen bringen. hasattr()
gibt immer False zurück (dh es wird immer ein AttributeError ausgelöst).
Wenn ich mir anschaue dir(master)
, Ich sehe diese Ausgabe:
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']
und sogar explizit angeben __all__
in master/__init__.py
hilft nicht, ändert aber das dir () in
['__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']
Irgendeine Idee, was ich falsch mache oder ob es eine Möglichkeit gibt, solche Tests durchzuführen?(Übrigens:Python 2.6 auf Win / Cygwin, wenn das von Interesse ist)
Lösung
Submodule sind keine Attribute ihrer übergeordneten Module, sofern nicht ausdrücklich angegeben.Versuchen Sie einfach, das Modul zu importieren und zu fangen ImportError
:
try:
__import__("os.peth", fromlist=[os])
except ImportError:
pass
Andere Tipps
du kannst es tun
try:
import module.submodule
except ImportError:
print 'failed or whatever'
Ich musste kürzlich die Existenz von Submodulen überprüfen und da ich Python 3.4.1 verwende, gebe ich eine neue Antwort auf die Frage:
In Python 3.4.1 können Sie verwenden importlib.util.find_spec(name, package=None)
(https://docs.python.org/3.4/library/importlib.html#importlib.util.find_spec)
import importlib
module_exists = importlib.util.find_spec('path.to.my.module')
So einfach =)