4

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

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 被导入两次。但是,我只想导入一次。

解决这个问题的明显方法(至少对我而言)是将某些路径pathfolderA.path

但我觉得 Python 一开始就不应该出现这个错误。还有哪些其他解决方法不需要每个文件都知道其绝对位置?

4

2 回答 2

5

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

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

文件夹A/文件B.py

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

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

于 2010-03-22T01:57:48.113 回答
5
  • 修改sys.path不是您在真实程序中所做的事情。它损害了模块化和可移植性,而永久设置 PYTHONPATH 或将模块放在 Python 可以找到的地方没有任何好处。

  • 从来没有使用过import *。它污染了你的命名空间并使你的代码变得不可预测。

  • 您不希望 folderA 在sys.path. 它是一个子包,main应始终如此对待。始终使用绝对导入到顶级包:import main.folderA而不是import folderA或其他任何东西;它将使您的代码更易于遵循、移动和安装。

于 2010-03-22T01:58:06.397 回答