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)

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top