python - __init__.py 找不到本地模块

标签 python package init python-module

借用 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'

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

最佳答案

将以下代码放在 Animals 目录下的 __init__.py 中。

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 的评论解释。)

关于python - __init__.py 找不到本地模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34753206/

相关文章:

java - ColdFusion 初始化需要外部配置文件的 Java 对象方法

debian - 如何获取 update-rc.d 或 insserv 以遵循依赖项

Java包文件夹命名约定

java - 从下载的源码目录运行Netty 4.0的DiscardServer

c - 在 C 中初始化一个结构

python - 按几乎相似的字符串分组

python - communicate() 和 .stdin.write、.stdout.read 或 .stderr.read 之间的区别 - python

python - 如何将简单的 png 图片添加到我的 Bokeh 网站?

python - 无法从网页中获取文本

java - 在 Java 中,资源应该放在包/源层次结构中的什么位置?