在同一Python包中加载模块

时间:2018-12-10 16:00:59

标签: python python-import

我有这样的目录结构:

myPackage /
    __init__.py
    module1
    module2
    module3
    ...

其中一些模块依赖于包装中的其他模块。由于某种原因,我发现从例如如果我这样写,则module1中的module2不起作用:

from module1 import func1, func2, ...

这表明没有名为module1的模块,我无法弄清楚为什么……这不行吗?是否存在任何可能导致此问题的已知陷阱?在同一个软件包中加载模块是否有其他首选的方法?

2 个答案:

答案 0 :(得分:2)

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

您可以将导入更新为

from myPackage.module1 import xyz

from .module1 import xyz

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

答案 1 :(得分:2)

好吧,我想再解释一下。

每个python程序都只有一个全局分层模块管理。 sys.path中的模块是顶部模块。因此,以您的代码为例:

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

尽管您在module1中加载了module2,但仍然需要遵守从软件包外部开始的当前模块管理。

此设计用于确保模块上的单例。所有导入的模块都缓存在sys.modules中,因此为了唯一地标识一个模块,所有模块都是基于层次结构进行管理的。

另一个例子:

在模块2中:

from myPackage import module1

在主文件中:

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

您将看到一个名为myPackage.module1的模块,尽管该模块是在myPackage.module2中导入的,但未命名为myPackage.module2.myPackage.module1