2013-09-30 4 views
3

Я поддерживаю словарь и загружается внутри файла конфигурации. Словарь загружается из файла JSON.Операция импорта: файл конфигурации Python

В config.py

name_dict = json.load(open(dict_file)) 

Я импортировать этот конфигурационный файл в нескольких других сценариев (file1.py, file2.py, ..., filen.py) с использованием

import config 

заявление. Мой вопрос в том, когда будет выполнен скрипт config.py? Я уверен, что это не будет выполнено для каждого вызова импорта, который создается внутри моих нескольких скриптов. Но что именно происходит, когда вызывается оператор import.

ответ

2

Код верхнего уровня в модуле выполняется один раз, первый раз, когда вы 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.


Обратите внимание, что вообще, вы не хотите, чтобы полагаться на ли код верхнего уровня в модуле выполняется один или несколько раз. Например, с учетом определения функции верхнего уровня, если вы никогда не сравниваете объекты функции или не перепровергаете любые глобальные переменные, от которых зависит само определение, а не только тело, это не имеет никакого значения. Однако есть некоторые исключения из этого, и загрузка файлов конфигурации времени запуска является прекрасным примером исключения.

Смежные вопросы