__ init__.py找不到本地模块

问题描述 投票:8回答:1

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

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

Project/
  Animals/
    __init__.py
    Mammals.py
    Birds.py

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

from Animals.Mammals import Mammals
x = Mammals()
x.printMammals()

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

from Mammals import Mammals
from Birds import Birds

但是,当完成此操作时,在类似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'

我觉得我犯了一个简单的错误,但找不到。感谢您的帮助!

python packages init python-module
1个回答
23
投票

__init__.py目录内的Animals中放置以下代码。

Python 3.x:

from .Mammals import Mammals
from .Birds import Birds

在2.x上:

from __future__ import absolute_import
from .Mammals import Mammals
from .Birds import Birds

说明:

找不到模块,因为它不知道要搜索哪个目录来查找文件MammalsBirds。您假设子文件夹Animals已添加到python搜索路径中,但是如果您选中sys.path(从Projects/Animals/__init__.py执行),则会看到只有Project的路径在路径上。我不确定为什么不搜索包含Project/Animals/__init__.py的目录,因为这是正在执行的代码,但是错误表明这是原因。

在模块名称前加上.会告诉Python您正在加载的模块位于当前模块的目录内。

((感谢@SeanM的评论进行解释。)

© www.soinside.com 2019 - 2024. All rights reserved.