Я разработал довольно хитрую схему импорта в своем проекте и думаю, что мог обнаружить ошибку в интерпретаторе Python, из-за которой модули импортируются дважды.
Вот как настроен мой тестовый проект:
/
Launcher.bat & mdash; Проект запускается отсюда. Он запускает 'main / __ init __. Py`, используя исполняемый файл Python 3.2
main / __ init __. Py & mdash; Скрипт __main__
, запущенный 'Launcher.bat'
main / foo.py & mdash; Содержит пустой класс
external / __ init __. Py & mdash; Сценарий, внешний по отношению к «основным» сценариям проекта, используемый для демонстрации проблемы
. / Launcher.bat
@echo off
C:\Python32\python.exe main\__init__.py
pause
. / Главная / __ __ INIT. Ру
from foo import Foo
print("In 'main', Foo has id:", id(Foo))
# Add the directory from which 'Launcher.bat' was run,
# which is not the same as the './main' directory
# in which this script is located
import sys
sys.path.insert(1, '.')
# This script will try to import class Foo, but in doing so
# will casue the interpreter to import this './main/__init__.py'
# script a second time.
__import__('external')
. / Главная / foo.py
class Foo:
pass
. / Внешний / __ __ INIT. Ру
from main.foo import Foo
print("In 'external', Foo has id:", id(Foo))
Все это напечатает сообщение 'Main script was imported'
дважды. Если внешний скрипт импортирует любые другие скрипты, они тоже будут импортированы дважды. Я проверял это только на Python 3.2. Это ошибка или я ошибся?
Вывод программы:
В 'main' у Foo есть id: 12955136
В 'main' у Foo есть id: 12955136
Во «внешнем» Foo есть id: 12957456
Нажмите любую клавишу для продолжения . , ,