Was könnte dazu führen, dass ein Python-Modul zweimal importiert wird?

Soweit ich verstehe, wird ein Python-Modul niemals zweimal importiert, dh der Code im Modul wird erst beim ersten Import ausgeführt. Nachfolgende Importanweisungen fügen einfach das Modul zum Umfang des Imports hinzu.

Ich habe ein Modul namens "TiledConvC3D.py", das scheint mehrfach importiert zu werden. Ich benutze pdb, um den Stack an der Oberseite des Codes für dieses Modul zu drucken.

Hier ist das Ende der Stack-Trace ab dem ersten Mal, wenn das Modul ausgeführt wird:

File "<anonymized>/python_modules/Theano/theano/gof/cmodule.py", line 328, in refresh key = cPickle.load(open(key_pkl, 'rb')) File "<anonymized>/ops/TiledConvG3D.py", line 565, in <module> import TiledConvC3D File "<anonymized>/ops/TiledConvC3D.py", line 18, in <module> pdb.traceback.print_stack() 

Es wird mehrmals mehr ausgeführt. Allerdings zeigt die komplette Stack-Trace zum zweiten Mal, wie es heißt, keine Anrufe zum reload , so dass diese Ausführungen nicht auftreten sollten:

 File "sup_train_conj_grad.py", line 103, in <module> dataset = Config.get_dataset(dataset_node) File "<anonymized>/Config.py", line 279, in get_dataset from datasets import NewWiskott File "<anonymized>/datasets/NewWiskott.py", line 16, in <module> normalizer_train = video.ContrastNormalizer3D(sigma, global_per_frame = False, input_is_5d = True) File "<anonymized>/util/video.py", line 204, in __init__ self.f = theano.function([input],output) File "<anonymized>/python_modules/Theano/theano/compile/function.py", line 105, in function allow_input_downcast=allow_input_downcast) File "<anonymized>/python_modules/Theano/theano/compile/pfunc.py", line 270, in pfunc accept_inplace=accept_inplace, name=name) File "<anonymized>/python_modules/Theano/theano/compile/function_module.py", line 1105, in orig_function fn = Maker(inputs, outputs, mode, accept_inplace = accept_inplace).create(defaults) File "/u/goodfeli/python_modules/Theano/theano/compile/function_module.py", line 982, in create _fn, _i, _o = self.linker.make_thunk(input_storage = input_storage_lists) File "<anonymized>/python_modules/Theano/theano/gof/link.py", line 321, in make_thunk output_storage = output_storage)[:3] File "<anonymized>/python_modules/Theano/theano/gof/cc.py", line 1178, in make_all output_storage = node_output_storage) File "<anonymized>/python_modules/Theano/theano/gof/cc.py", line 774, in make_thunk cthunk, in_storage, out_storage, error_storage = self.__compile__(input_storage, output_storage) File "<anonymized>/python_modules/Theano/theano/gof/cc.py", line 723, in __compile__ output_storage) File "<anonymized>/python_modules/Theano/theano/gof/cc.py", line 1037, in cthunk_factory module = get_module_cache().module_from_key(key=key, fn=self.compile_cmodule) File "<anonymized>/python_modules/Theano/theano/gof/cc.py", line 59, in get_module_cache return cmodule.get_module_cache(config.compiledir) File "<anonymized>/python_modules/Theano/theano/gof/cmodule.py", line 576, in get_module_cache _module_cache = ModuleCache(dirname, force_fresh=force_fresh) File "<anonymized>/python_modules/Theano/theano/gof/cmodule.py", line 268, in __init__ self.refresh() File "<anonymized>/python_modules/Theano/theano/gof/cmodule.py", line 326, in refresh key = cPickle.load(open(key_pkl, 'rb')) File "<anonymized>/ops/TiledConvV3D.py", line 504, in <module> import TiledConvG3D File "<anonymized>/ops/TiledConvG3D.py", line 565, in <module> import TiledConvC3D File "<anonymized>/ops/TiledConvC3D.py", line 22, in <module> pdb.traceback.print_stack() 

Außerdem überprüfe ich auch die id von __builtin__.__import__ . Am Anfang meines Hauptskripts importiere ich __builtin__ und __builtin__ id(__builtin__.__import__) bevor ich irgendwelche anderen Importe machst. Ich id(__builtin__.import__) auch id(__builtin__.import__) aus meinem Modul, das mehrmals importiert wird, und der Wert der ID ändert sich nicht.

Gibt es noch andere Mechanismen neben dem Aufrufen von Reload und __builtin__.__import__ das könnte erklären, mein Modul wird mehrmals geladen?

One Solution collect form web for “Was könnte dazu führen, dass ein Python-Modul zweimal importiert wird?”

Ein Python-Modul kann zweimal importiert werden, wenn das Modul zweimal im Pfad gefunden wird. Zum Beispiel sagen Sie, dass Ihr Projekt so ausgelegt ist:

  • Src /
    • Package1 /
      • Spam.py
      • Eier

Angenommen, Ihr PYTHONPATH (sys.path) enthält src und src / package1:

 PYTHONPATH=/path/to/src:/path/to/src/package1 

Wenn das der Fall ist, können Sie das gleiche Modul zweimal so importieren:

 from package1 import spam import spam 

Und Python wird denken, sie sind verschiedene Module. Ist das was los?

Auch nach der Diskussion unten (für Benutzer, die diese Frage suchen), eine andere Möglichkeit, ein Modul kann zweimal importiert werden, wenn es eine Ausnahme in der Mitte durch den ersten Import gibt. Zum Beispiel, wenn Spam Eier importiert, aber das Importieren von Eiern führt zu einer Ausnahme innerhalb des Moduls , kann es wieder importiert werden.

  • Mit __init__.py
  • Was ist __init__.py für?
  • Python-Module reinigen und Mac OS X neu starten
  • Importieren von Modulen in Python und __init__.py
  • Installiere das Python-Modul mit einer Zip-Datei
  • Python-Modul und __all__
  • Wie kann ich feststellen, ob ein Python-Skript als Modul importiert oder als Skript ausgeführt wird?
  • __builtin__ Modul in Python
  • Pythonmechanisierungsmodul nicht gefunden
  • Wie greife ich von den anderen Modulen auf die Attribute des aktuellen Ausführungsmoduls zu?
  • Wie bekomme ich Python, um das Modul von $ HOME / lib / python über / usr / lib / python zu bevorzugen?
  • Python ist die beste Programmiersprache der Welt.