在同一个 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
。
我有这样的目录结构:
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
。