多次导入同一个模块

Pon*_*dle 4 python import import-hooks

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

main/
    __init__.py
    folderA/
        __init__.py
        fileA.py
        fileB.py
Run Code Online (Sandbox Code Playgroud)

真的,还有大约50个文件.但那不是重点.在main/__init__.py,我有这个代码:from folderA.fileA import *

folderA/__init__.py我有这个代码:

sys.path.append(pathToFolderA)
Run Code Online (Sandbox Code Playgroud)

folderA/fileB.py我有这个代码:

from fileA import *
Run Code Online (Sandbox Code Playgroud)

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

解决这个问题(我ATLEAST)最显而易见的方法是改变从某些路径pathfolderA.path

但我觉得Python首先应该没有这个错误.还有哪些其他解决方法不需要每个文件知道它的绝对位置?

小智 5

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

改为使用绝对或明确相对的导入.(模糊相对导入可以作为旧版Python版本的最后手段.)

folderA/fileB.py

from main.folderA.fileA import *   # absolute
from .fileA import *               # unambiguous-relative
from fileA import *                # ambiguous-relative
Run Code Online (Sandbox Code Playgroud)

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


Mik*_*ham 5

  • 修改sys.path不是你在真实程序中做的事情.它会损害模块性和可移植性,而不会永久地设置PYTHONPATH或将模块放在Python可以找到的位置.

  • 从来没有使用过import *.它会污染您的命名空间并使您的代码无法预测.

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