这个问题已经有了答案:
Python import precedence: packages or modules?
4个答案
假设我有以下python源文件布局:

lib/foo.py
lib/foo/bar.py

然后在我的源代码中:
from foo import gaz

我收到一个导入错误:
ImportError: No module named foo

我怎样才能有一个.py文件和一个同名的目录,以便我可以执行以下操作:
 from foo import gaz
 from foo.bar import wakawaka

事先谢谢!

最佳答案

使用单个导入时,您遇到的实际问题是packages优先于模块:
请注意,当使用from package import item时,该项可以是
包的子模块(或子包)或定义的其他名称
在包中,比如函数、类或变量。import
语句首先测试该项是否在包中定义;如果
不是,它假定它是一个模块,并尝试加载它。如果失败了
找到它,会引发一个ImportError异常。
无论如何,我强烈建议重命名文件或目录,因为您不能导入多个具有给定名称的模块。出现问题的原因是每个模块/包对象都存储在sys.modules中,这是一个简单的dict中,因此它不能包含多个相等的键。
特别是,在执行以下操作时,假设foo.pyfoo目录在不同的目录中(如果它们不在,您仍然无法导入foo.py):

from foo import gaz

它将加载foo.py并将模块放入sys.modules中,然后尝试执行以下操作:
from foo.bar import wakaka

将失败,因为导入尝试使用模块而不是包。
如果您首先导入,则会发生相反的情况;导入将使用包而不是模块。

09-04 05:07
查看更多