可以说,我有以下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
中,项目可以是在封装的子模块(或子包),或在包中定义的,像一个函数,类或变量其它名称。 在import
语句首先测试的项目是否在包中定义; 如果没有,它假定它是一个模块,并尝试加载它。 如果没有找到它,一个ImportError
异常。
反正我强烈建议重命名文件或因为你不能使用相同的名字导入多个模块的目录。 出现该问题是因为每个模块/包对象被存储到sys.modules
,这是一个简单的dict
,因此它不能包含多个相等的键。
具体而言,假设foo.py
和foo
目录在不同的目录(如果他们是不是你仍然不能导入foo.py
),当这样做的:
from foo import gaz
这将加载foo.py
并把模块插入sys.modules
,然后尝试做:
from foo.bar import wakaka
因为进口尝试使用该模块将失败foo.py
而不是包装。
恰好相反,如果你第一次导入foo.bar
; 进口将使用软件包,而不是模块。
我敢肯定这是不是你应该做的,但你可以强制Python中导入特定的文件作为一个模块小鬼 :
import imp
with open("foo.py") as source:
foo = imp.load_module("foo", source, "./", ('', '', imp.PY_SOURCE))
现在你可以这样做:
gaz_instance = foo.gaz()