多次导入同一模块

4 投票
2 回答
2291 浏览
提问于 2025-04-15 20:41

经过几个小时的调试,我终于找到了我应用程序中的一个错误原因。我的应用程序的文件结构大致是这样的:

main/
    __init__.py
    folderA/
        __init__.py
        fileA.py
        fileB.py

其实还有大约50个文件,但这不是重点。在 main/__init__.py 文件中,我有这么一行代码: from folderA.fileA import *

folderA/__init__.py 文件中,我写了这段代码:

sys.path.append(pathToFolderA)

folderA/fileB.py 文件中,我有这段代码:

from fileA import *

问题是,fileA 被导入了两次,但我只想导入一次。

对我来说,解决这个问题的明显方法是把某些路径从 path 改成 folderA.path

不过我觉得,Python 本身不应该出现这样的错误。还有没有其他的解决办法,不需要每个文件都知道它的绝对位置呢?

2 个回答

5
  • 修改 sys.path 不是在真正的程序中应该做的事情。这会影响程序的模块化和可移植性,而且没有比永久设置 PYTHONPATH 或把你的模块放在 Python 能找到的地方更好的选择。

  • 绝对不要使用 import *。这样会污染你的命名空间,让你的代码变得不可预测。

  • 你不应该把 folderA 加到 sys.path 中。它是 main 的一个子包,应该始终这样对待。总是使用绝对导入,直接指向顶层包:用 import main.folderA 而不是 import folderA 或其他任何方式;这样会让你的代码更容易理解、移动和安装。

5

不要这样修改 sys.path,因为这样会让你有两种方式(名字)来访问你的模块,这样会导致问题。

建议使用绝对导入或者明确的相对导入。 (模糊的相对导入可以在旧版本的 Python 中作为最后的选择使用。)

folderA/fileB.py

from main.folderA.fileA import *   # absolute
from .fileA import *               # unambiguous-relative
from fileA import *                # ambiguous-relative

当然,你应该用具体的名字来代替那个星号。

撰写回答