Это в основном дикое предположение, но единственное объяснение, которое я могу представить с предоставленной информацией, - это то, что некоторые из ваших "других модулей" импортируют ваш файл. Если это так, вы должны реструктурировать свой код, чтобы избежать циклических зависимостей. Простой способ проверить это состоит в том, чтобы добавить защиту, предотвращающую выполнение всего под вашим определением класса при импорте:
class Engine:
# ...
if __name__ == "__main__":
engine = Engine()
print("above engine start reached")
app_init = False # I added this purely for debugging reasons
if not app_init:
app_init = True
engine.start()
Также, пожалуйста, переместите ваши импорты (те, что в Engine.__init__
) вверху модуля. -уровень.
РЕДАКТИРОВАТЬ :
Проблема с импортом (я получил deltatime из движка в другом модуле).
Проблема дизайна.
После удаления этого импорта движок больше не инициализируется повторно. Я сейчас использую, если name == "main". (...) Я понятия не имел, что engine = Engine () внизу будет повторно инициализировать engine при импорте модуля.
Python - язык времени выполнения - за исключением байт-кода компиляция, все происходит во время выполнения. Когда модуль Python загружается впервые (в данном процессе), выполняется весь код на верхнем уровне модуля - так создаются функции и классы (def
и class
являются исполняемыми операторами ) et c - тогда он кешируется в sys.modules
dict (под именем модуля) для других импортов (поэтому он загружается только один раз).
Теперь, когда модуль используется в качестве сценария, происходит то же самое, за исключением того, что модуль импортируется (и кэшируется) под именем __main__
. Поэтому, когда ваш другой модуль пытается импортировать ваш основной скрипт, загрузчик ищет имя скрипта, не находит его (потому что он был кэширован как « main », а не как «youscriptname»), и так перезагружает это. Это объясняет двойную загрузку, но это также означает, что эти два модуля - это разные экземпляры, классы - это разные классы, а экземпляры 'engine' - это разные экземпляры.
IOW, в то время как защита if __name__ == '__main__'
предотвращает повторное выполнение "основного" кода вашего скрипта, вы только замаскировали симптом, но не устранили проблему root. Короче говоря, ни один из ваших модулей не должен пытаться получить доступ к чему-либо определенному в основном скрипте.
Если в вашем основном скрипте определены функции или классы, которые вы хотите использовать в другом месте, вы должны извлечь их в другой модуль. Но если что-то в другом модуле должно получить доступ к engine
экземпляру из основного сценария, то вам придется переосмыслить свой дизайн, чтобы явно передать экземпляр engine
(или все, что нужно от него).