在同一个 Python 包中加载模块

Loading modules in the same Python package

我有这样的目录结构:

myPackage /
    __init__.py
    module1
    module2
    module3
    ...

其中一些模块依赖于包中的其他模块。出于某种原因,我发现从例如导入如果我这样写 module1 in module2 是行不通的:

from module1 import func1, func2, ...

这表示没有名为 module1 的模块,我不明白为什么...这不应该起作用吗?是否有任何已知的陷阱可能导致此问题?是否有不同的方法在首选的同一包中加载模块?

module1 不在您的路径上,因此 from module1 import xyz 将不起作用(因为找不到 module1)。

您可以将导入更新为

from myPackage.module1 import xyz

from .module1 import xyz

第二个很好,因为它避免了在包内重复包名,但这意味着您不能轻易地直接执行 module1(例如 python module1.py)。如果不需要直接执行就没问题。

好吧,我想再解释一下。

每个python程序都有一个且唯一的全局分层模块管理。 sys.path 中的模块是顶级模块。所以以你的代码为例:

root
----myPackage
--------module1 <- this is what you want.
--------module2
----module1 <- this does not exist.

虽然你在module2中加载了module1,但它仍然需要服从当前在包外启动的模块管理。

这种设计是为了保证模块上的单例。所有导入的模块都缓存在sys.modules中,为了唯一标识一个模块,所有模块都按层级管理。

另一个例子:

在模块 2 中:

from myPackage import module1

在你的主文件中:

from myPackage import module2
import sys
print(sys.modules)

您会看到一个名为 myPackage.module1 的模块,虽然它是在 myPackage.module2 中导入的,但它没有被命名为 myPackage.module2.myPackage.module1