首页 > 解决方案 > Python 模块导入的层次结构是什么?

问题描述

假设我在一个目录中有 Python 模块,并且在同一个目录中我有一个 Python 脚本,它以某种方式使用这个模块。

wdir
├── module
│   └── module_stuff
└── script.py

如果我在未安装模块的 python 环境中执行此文件,则一切正常,因为 Python 从其源代码导入模块。

问题是:如果我在这个 Python 环境中安装模块并继续以与以前相同的方式执行脚本,Python 会从已安装的模块中导入模块还是从源代码中导入模块?Python 搜索每个导入遵循的层次结构是什么?

为什么重要:如果我有一个脚本在这个执行过程中反复调用其他Python脚本并修改了模块的源代码,那么就会出现使用旧版本的模块和新版本的结果,甚至更糟,如果在模块代码中插入错误,则可能会错过执行。但是,如果创建一个与测试环境分开的开发环境,这将得到解决。

标签: python

解决方案


似乎取决于sys.path

引用https://docs.python.org/3/tutorial/modules.html#the-module-search-path

当导入名为 spam 的模块时,解释器首先搜索具有该名称的内置模块。如果没有找到,它会在变量 sys.path 给出的目录列表中搜索名为 spam.py 的文件。sys.path 从这些位置初始化:[编辑:大概按此顺序]

包含输入脚本的目录(或未指定文件时的当前目录)。

PYTHONPATH(目录名称列表,与 shell 变量 PATH 具有相同的语法)。

安装相关的默认值。

接着说

初始化后,Python 程序可以修改 sys.path。

这向我表明理论上任何事情都可能发生:-/

我猜module_stuff它与内置函数的名称不同,因此排除了其中的第一个。

您可能知道,Python 不会在一次运行中两次导入同一个模块。也许您可以通过对它进行一些小的更改module/module_stuff并再次运行来测试它。


推荐阅读