我正在维护一个字典,它被加载到配置文件中。字典是从 JSON 文件加载的。
在 config.py
name_dict = json.load(open(dict_file))
我正在使用其他几个脚本(file1.py、file2.py、...、filen.py)导入这个配置文件
import config
陈述。我的问题是什么时候执行 config.py 脚本?我确信在我的多个脚本中进行的每个导入调用都不会执行它。但是,调用 import 语句时究竟会发生什么。
我正在维护一个字典,它被加载到配置文件中。字典是从 JSON 文件加载的。
在 config.py
name_dict = json.load(open(dict_file))
我正在使用其他几个脚本(file1.py、file2.py、...、filen.py)导入这个配置文件
import config
陈述。我的问题是什么时候执行 config.py 脚本?我确信在我的多个脚本中进行的每个导入调用都不会执行它。但是,调用 import 语句时究竟会发生什么。
模块中的顶级代码执行一次,第一次执行import
。之后会在 中找到模块对象sys.modules
,不会重新执行代码重新生成。
有几个例外:
reload
, 明显地。sys.path
,那么您最终可能会成为同一事物mypackage.mymodule
的mymodule
两个副本,在在这种情况下代码会运行两次)。sys.modules
.imp
/importlib
之类的函数。multiprocessing
(以及间接使用它的模块,例如concurrent.futures
)。对于 Python 3.1 及更高版本,这一切都在导入系统下进行了详细描述。特别是,查看搜索部分。(multiprocessing
针对该模块描述了特定情况。)
对于早期版本的 Python,您几乎必须从各种不同的来源推断行为,并且要么阅读代码,要么进行试验。但是,有据可查的新行为旨在像旧行为一样工作,除非有明确描述的方式,因此即使是 2.x,您通常也可以阅读 3.x 文档。
请注意,通常,您不想依赖模块中的顶级代码是运行一次还是多次。例如,给定一个顶级函数定义,只要您从不比较函数对象,或重新绑定它(意味着定义本身,而不仅仅是主体)所依赖的任何全局变量,它就没有任何区别。但是,也有一些例外,加载启动时配置文件就是一个完美的例外示例。