多次导入同一个模块

时间:2010-03-22 01:51:08

标签: python import import-hooks

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

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 个答案:

答案 0 :(得分:5)

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

使用绝对值或unambiguous-relative imports代替。 (模糊相对导入可以作为旧版Python版本的最后手段。)

folderA / fileB.py

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

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

答案 1 :(得分:5)

  • 修改sys.path不是您在实际程序中执行的操作。它会损害模块性和可移植性,而不会永久地设置PYTHONPATH或将模块放在Python可以找到的地方。

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

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