【问题标题】:Import statement: Config file Python导入语句:配置文件 Python
【发布时间】:2013-09-30 21:56:59
【问题描述】:
我正在维护一个字典,它被加载到配置文件中。字典是从 JSON 文件加载的。
在 config.py 中
name_dict = json.load(open(dict_file))
我正在使用其他几个脚本(file1.py、file2.py、...、filen.py)导入这个配置文件
import config
声明。我的问题是什么时候执行 config.py 脚本?我确信在我的多个脚本中进行的每个导入调用都不会执行它。但是,调用 import 语句时究竟会发生什么。
【问题讨论】:
标签:
python
import
configuration-files
【解决方案1】:
一个模块中的顶级代码执行一次,第一次你import它。之后会在sys.modules中找到module对象,不会重新执行代码重新生成。
有几个例外:
-
reload,很明显。
- 不小心以两个不同的名称导入同一个模块(例如,如果模块在一个包中,并且您在包的中间有一些目录
sys.path,那么您最终可能会得到 mypackage.mymodule 和mymodule 是同一事物的两个副本,在这种情况下代码会运行两次)。
- 安装替换标准行为的导入挂钩/自定义导入。
- 明确与
sys.modules 胡闹。
- 直接从
imp/importlib等中调用函数。
-
multiprocessing 的某些情况(以及间接使用它的模块,例如 concurrent.futures)。
对于 Python 3.1 及更高版本,这一切都在The import system 下进行了详细描述。特别是,查看搜索部分。 (针对该模块描述了multiprocessing 特定的情况。)
对于早期版本的 Python,您几乎必须从各种不同的来源推断行为,并且要么阅读代码,要么进行试验。但是,有据可查的新行为旨在与旧行为一样工作,但具体描述方式除外,因此即使是 2.x,您通常也可以阅读 3.x 文档。
请注意,一般而言,您不想依赖模块中的顶级代码是运行一次还是多次。例如,给定一个顶级函数定义,只要您从不比较函数对象,或重新绑定它(意味着定义本身,而不仅仅是主体)所依赖的任何全局变量,它就没有任何区别。但是,也有一些例外,加载启动时配置文件就是一个完美的例外示例。