Что может привести к тому, что модуль python будет импортирован дважды?

Насколько я понимаю, модуль python никогда не импортируется дважды, то есть код в модуле запускается только при первом импорте. Последующие операторы импорта просто добавляют модуль в область импорта.

У меня есть модуль под названием «TiledConvC3D.py», который, кажется, несколько раз импортируется. Я использую pdb для печати стека в верхней части кода для этого модуля.

Вот конец трассировки стека с момента выполнения модуля:

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

Это продолжается еще несколько раз. Тем не менее, полная трассировка стека во второй раз, когда он вызывается, не показывает никаких вызовов для reload , поэтому эти исполнения не должны возникать:

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

Кроме того, я также проверяю идентификатор __builtin__.__import__ . В самом начале моего основного сценария я импортирую __builtin__ и распечатываю id(__builtin__.__import__) перед выполнением любых других импортных id(__builtin__.__import__) . Я также распечатываю id(__builtin__.import__) внутри моего модуля, который импортируется несколько раз, а значение id не изменяется.

Существуют ли другие механизмы помимо вызова перезагрузки и переопределения __builtin__.__import__ которые могли бы объяснить, что мой модуль загружается несколько раз?

One Solution collect form web for “Что может привести к тому, что модуль python будет импортирован дважды?”

Модуль Python может быть импортирован дважды, если модуль найден дважды в пути. Например, скажите, что ваш проект выложен следующим образом:

  • SRC /
    • package1 /
      • spam.py
      • eggs.py

Предположим, что ваш PYTHONPATH (sys.path) включает src и src / package1:

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

Если это так, вы можете дважды импортировать тот же модуль:

 from package1 import spam import spam 

И Python будет думать, что они разные модули. Это то, что происходит?

Кроме того, в соответствии с приведенным ниже обсуждением (для пользователей, которые ищут этот вопрос), другой способ, которым модуль может быть импортирован дважды, – это если есть исключение на полпути через первый импорт. Например, если спам импортирует яйца, но импорт яиц приводит к исключению внутри модуля , его можно снова импортировать.

  • Зависимость модуля Python
  • Python: модуль протоколирования - глобально
  • установка модуля запросов в окнах python 2.7
  • Colorama AssertionError в Python 3.2
  • Как я могу «поймать» ошибку seg при импорте модуля F2Py?
  • Вложение Python в C: проблемы с импортом локальных модулей
  • глобальная переменная, определенная в основном скрипте, не может быть доступна функцией, определенной в другом модуле
  • Импорт пользовательских модулей в python из каталога
  • Python - лучший язык программирования в мире.