Код верхнего уровня в модуле выполняется один раз, первый раз, когда вы import
. После этого объект модуля будет найден в sys.modules
, и код не будет повторно выполнен для его повторного создания.
Есть несколько исключений из этого:
reload
, очевидно.
- Случайный импорт одного и того же модуля под двумя разными именами (например, если модуль находится в пакете, и у вас есть какой-то каталог в середине пакета в
sys.path
, вы можете получить mypackage.mymodule
и mymodule
в двух экземплярах то же самое, и в этом случае код запускается дважды).
- Установка импортных крючков/импортированных, которые заменяют стандартное поведение.
- Явно обезьяна с
sys.modules
.
- Непосредственно вызывающие функции из
imp
/importlib
или тому подобное.
- Некоторые случаи с
multiprocessing
(и модули, которые используют это косвенно, например concurrent.futures
).
Для Python 3.1, а затем, все это подробно описано в соответствии с The import system. В частности, посмотрите раздел «Поиск». (multiprocessing
- конкретные случаи описаны для этого модуля.)
Для более ранних версий Python вы в значительной степени должны вывести поведение из разных источников и либо прочитать код, либо поэкспериментировать. Тем не менее, хорошо документированное новое поведение предназначено для работы подобно старому поведению, за исключением специально описанных способов, поэтому вы обычно можете уйти с чтением документов 3.x даже для 2.x.
Обратите внимание, что вообще, вы не хотите, чтобы полагаться на ли код верхнего уровня в модуле выполняется один или несколько раз. Например, с учетом определения функции верхнего уровня, если вы никогда не сравниваете объекты функции или не перепровергаете любые глобальные переменные, от которых зависит само определение, а не только тело, это не имеет никакого значения. Однако есть некоторые исключения из этого, и загрузка файлов конфигурации времени запуска является прекрасным примером исключения.