假设我有以下 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
提前致谢!
假设我有以下 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
提前致谢!
使用单个导入时,您遇到的实际问题是由于包优先于模块:
请注意,使用 时
from package import item
,item 可以是包的子模块(或子包),也可以是包中定义的其他名称,如函数、类或变量。该import
语句首先测试该项目是否在包中定义;如果不是,它假定它是一个模块并尝试加载它。如果找不到它,ImportError
则会引发异常。
无论如何,我强烈建议重命名文件或目录,因为您不能导入多个具有给定名称的模块。出现问题是因为每个模块/包对象都存储在sys.modules
中,这是一个简单的dict
,因此它不能包含多个相等的键。
特别是,假设foo.py
和foo
目录在不同的目录中(如果不是,你仍然不能 import foo.py
),当这样做时:
from foo import gaz
它将加载foo.py
并将模块放入sys.modules
,然后尝试执行以下操作:
from foo.bar import wakaka
将失败,因为导入尝试使用模块foo.py
而不是包。
如果您首先导入,则会发生相反的情况foo.bar
;导入将使用包而不是模块。
我很确定这不是您应该做的事情,但是您可以强制 Python 使用imp将特定文件作为模块导入:
import imp
with open("foo.py") as source:
foo = imp.load_module("foo", source, "./", ('', '', imp.PY_SOURCE))
现在你可以这样做:
gaz_instance = foo.gaz()