Python导入类与目录同名

时间:2013-04-26 20:56:43

标签: python import importerror

假设我有以下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

提前感谢!

2 个答案:

答案 0 :(得分:10)

您使用单个导入时遇到的实际问题是由于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

将失败,因为导入尝试使用模块foo.py而不是包。

如果您首先导入foo.bar,则会发生相反的情况;导入将使用包而不是模块。

答案 1 :(得分:1)

我很确定这不是您应该做的事情,但您可以强制Python使用imp将特定文件作为模块导入:

import imp

with open("foo.py") as source:
    foo = imp.load_module("foo", source, "./", ('', '', imp.PY_SOURCE))

现在你可以这样做:

gaz_instance = foo.gaz()