【问题标题】:importing same module more than once多次导入同一个模块
【发布时间】:2010-03-22 01:51:07
【问题描述】:

几个小时后,我发现了我的应用程序中出现错误的原因。我的应用源的结构如下:

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 一开始就不应该出现这个错误。还有哪些不需要每个文件都知道其绝对位置的解决方法?

【问题讨论】:

    标签: python import import-hooks


    【解决方案1】:

    不要以这种方式修改 sys.path,因为它提供了两种方式(名称)来访问您的模块,从而导致您的问题。

    改用绝对或unambiguous-relative imports。 (对于较旧的 Python 版本,不明确的相对导入可以作为最后的手段。)

    文件夹A/fileB.py

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

    当然,您应该使用特定的名称来代替那颗星。

    【讨论】:

      【解决方案2】:
      • 修改sys.path 不是您在实际程序中所做的事情。它损害了模块化和可移植性,而永久设置 PYTHONPATH 或将模块放在 Python 可以找到的地方没有任何好处。

      • 永远不要使用import *。它会污染您的命名空间并使您的代码无法预测。

      • 您不希望 sys.path 上的文件夹 A。它是main 的子包,应始终如此对待。始终使用绝对导入到顶级包:import main.folderA 而不是import folderA 或其他任何东西;这将使您的代码更容易跟踪、移动和安装。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-08
        • 2023-04-11
        • 1970-01-01
        相关资源
        最近更新 更多