__init__.py无法找到本地模块

Dar*_*fee 7 python packages python-module init

借用http://pythoncentral.io/how-to-create-a-python-package/上的简化示例

我有一个类似的文件结构如下,其中Mammals.py和Birds.py定义具有相同名称的类:

Project/
  Animals/
    __init__.py
    Mammals.py
    Birds.py
Run Code Online (Sandbox Code Playgroud)

Project/目录中运行ipython解释器并且__init__.py为空时,以下工作:

from Animals.Mammals import Mammals
x = Mammals()
x.printMammals()
Run Code Online (Sandbox Code Playgroud)

我希望能够写from Animals import Mammals而不是from Animals.Mammals import Mammals.我相信这样做的方法是使__init__.py文件内容如下:

from Mammals import Mammals
from Birds import Birds
Run Code Online (Sandbox Code Playgroud)

但是,完成此操作后,从类似的Project/源ipython解释器中,以下输入会产生错误:

In [1]: from Animals import Mammals
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-1-6d651848af9b> in <module>()
----> 1 from Animals import Mammals

/Users/username/Project/Animals/__init__.py in <module>()
----> 1 from Mammals import Mammals
      2 from Birds import Birds

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

我觉得我犯的是一个简单的错误,但找不到.谢谢你的帮助!

mas*_*nun 17

在目录__init__.py里面输入以下代码Animals.

Python 3.x:

from .Mammals import Mammals
from .Birds import Birds
Run Code Online (Sandbox Code Playgroud)

在2.x上:

from __future__ import absolute_import
from .Mammals import Mammals
from .Birds import Birds
Run Code Online (Sandbox Code Playgroud)

  • 这是一个无用的答案,因为它1.不能解释用户代码为什么有这样的问题2.不能解释为什么解决方案可以解决问题。使用此答案的唯一方法是通过复制粘贴它,它无助于了解发生了什么。请详细说明问题的根源,我很乐意赞成这样的答案 (6认同)
  • 阅读这篇文章帮助我清楚地了解问题的根本原因:http://python-notes.curiousefficiency.org/en/latest/python_concepts/import_traps.html (2认同)