前言
最近在写一个服务器-客户端逻辑的程序,想在客户端和服务端下都写上constants.py
来作为配置文件,但是发现import constants
怎么样都只能获取到客户端下面的constants.py
,遂查之。
正文
1. 模块屏蔽 (module shadowing)
我们的具体目录如下:
.
|———server/
| |————server.py
| |____constants.py
|
|———main.py
|___constanst.py <----import constants无论如何都只能获取到这个
询问Gemini,发现问题这是由于模块屏蔽 (module shadowing):简单来说,当你运行程序时,Python会按照一个特定的路径列表(sys.path)去查找你要导入的模块。这个列表的第一个路径通常是你启动程序时所在的根目录。因此,当我们运行server.py
时,执行import constants
操作的时候,具体寻找constants
操作如下:
- Python开始在它的“地图”(
sys.path
)上寻找constants.py
。 - 它首先检查根目录,立刻就找到了
/constants.py
。 - 找到之后,它就停止搜索了,完全不会再去看 server/ 目录下是否也有一个同名文件
constants.py
。
2. 解决办法
其实如果要保持同名,最简单的解决办法有两个:
- 使用相对路径导入:
from . import constants
(.
代表当前目录) - 使用绝对路径导入:
from server import constants
(从根目录开始走绝对路径)
一般来说都会使用相对目录,因为它是在包(文件夹)内部引用模块的最标准、最Pythonic的方式。
总结
模块屏蔽,当你的模块被根目录的同名文件覆盖了怎么办?使用相对路径导入~
O(∩_∩)O
参考
[1] Gemini
Q.E.D.