我有这样的目录结构:
myPackage /
__init__.py
module1
module2
module3
...
其中一些模块依赖于包装中的其他模块。由于某种原因,我发现从例如如果我这样写,则module1
中的module2
不起作用:
from module1 import func1, func2, ...
这表明没有名为module1
的模块,我无法弄清楚为什么……这不行吗?是否存在任何可能导致此问题的已知陷阱?在同一个软件包中加载模块是否有其他首选的方法?
答案 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
。