前言

最近在写一个服务器-客户端逻辑的程序,想在客户端和服务端下都写上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操作如下:

  1. Python开始在它的“地图”(sys.path)上寻找 constants.py
  2. 它首先检查根目录,立刻就找到了 /constants.py
  3. 找到之后,它就停止搜索了,完全不会再去看 server/ 目录下是否也有一个同名文件constants.py

2. 解决办法

其实如果要保持同名,最简单的解决办法有两个:

  1. 使用相对路径导入:from . import constants.代表当前目录)
  2. 使用绝对路径导入:from server import constants(从根目录开始走绝对路径)

一般来说都会使用相对目录,因为它是在包(文件夹)内部引用模块的最标准、最Pythonic的方式。

总结

模块屏蔽,当你的模块被根目录的同名文件覆盖了怎么办?使用相对路径导入~

O(∩_∩)O

参考

[1] Gemini

Q.E.D.


立志做一个有趣的碳水化合物