3

我正在维护一个字典,它被加载到配置文件中。字典是从 JSON 文件加载的。

在 config.py

name_dict = json.load(open(dict_file))

我正在使用其他几个脚本(file1.py、file2.py、...、filen.py)导入这个配置文件

import config

陈述。我的问题是什么时候执行 config.py 脚本?我确信在我的多个脚本中进行的每个导入调用都不会执行它。但是,调用 import 语句时究竟会发生什么。

4

1 回答 1

2

模块中的顶级代码执行一次,第一次执行import。之后会在 中找到模块对象sys.modules,不会重新执行代码重新生成。

有几个例外:

  • reload, 明显地。
  • 不小心以两个不同的名称导入了同一个模块(例如,如果模块在一个包中,并且您在包的中间有一些目录 in sys.path,那么您最终可能会成为同一事物mypackage.mymodulemymodule两个副本,在在这种情况下代码会运行两次)。
  • 安装替换标准行为的导入钩子/自定义导入。
  • 明确地与sys.modules.
  • 直接调用imp/importlib之类的函数。
  • 某些情况下multiprocessing(以及间接使用它的模块,例如concurrent.futures)。

对于 Python 3.1 及更高版本,这一切都在导入系统下进行了详细描述。特别是,查看搜索部分。(multiprocessing针对该模块描述了特定情况。)

对于早期版本的 Python,您几乎必须从各种不同的来源推断行为,并且要么阅读代码,要么进行试验。但是,有据可查的新行为旨在像旧行为一样工作,除非有明确描述的方式,因此即使是 2.x,您通常也可以阅读 3.x 文档。


请注意,通常,您不想依赖模块中的顶级代码是运行一次还是多次。例如,给定一个顶级函数定义,只要您从不比较函数对象,或重新绑定它(意味着定义本身,而不仅仅是主体)所依赖的任何全局变量,它就没有任何区别。但是,也有一些例外,加载启动时配置文件就是一个完美的例外示例。

于 2013-09-30T22:01:53.540 回答