Python导入类与目录同名

Dav*_*ams 12 python import importerror

可以说我有以下python源文件布局:

lib/foo.py
lib/foo/bar.py
Run Code Online (Sandbox Code Playgroud)

然后在我的源代码中:

from foo import gaz
Run Code Online (Sandbox Code Playgroud)

我收到导入错误:

ImportError: No module named foo
Run Code Online (Sandbox Code Playgroud)

如何拥有.py文件和具有相同名称的目录,以便我可以执行以下操作:

 from foo import gaz
 from foo.bar import wakawaka
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Bak*_*riu 11

您使用单个导入时遇到的实际问题是由于具有优先于模块的:

请注意,在使用时from package import item,该项可以是包的子模块(或子包),也可以是包中定义的其他名称,如函数,类或变量.该import 语句首先测试该项是否在包中定义; 如果没有,它假定它是一个模块并尝试加载它.如果找不到,ImportError则会引发异常.

无论如何,我强烈建议重命名文件或目录,因为你不能导入多个具有给定名称的模块.出现问题是因为存储了每个模块/包对象sys.modules,这很简单dict,因此它不能包含多个相等的键.

特别是,假设foo.pyfoo目录在不同的目录中(如果它们不是你仍然无法导入foo.py),在执行时:

from foo import gaz
Run Code Online (Sandbox Code Playgroud)

它将加载foo.py并放入模块sys.modules,然后尝试:

from foo.bar import wakaka
Run Code Online (Sandbox Code Playgroud)

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

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

  • 嗯,我理解,也接受。有点像 Python 上的一个疣。在*许多* OO 语言中,出于命名空间目的而设置此文件和目录是很常见的,但是没关系。 (3认同)
  • @DavidWilliams 您评论中的代码只是证实了我在回答中所说的内容。`foo` 包被加载,然后它找不到名称 `Foo`。你的问题的答案是你*不能*在同一目录中拥有`foo.py`和`foo/__init__.py`并且有一个有效的`import`。 (2认同)