__init__.py 找不到本地模块

Posted

技术标签:

【中文标题】__init__.py 找不到本地模块【英文标题】:__init__.py can't find local modules 【发布时间】:2016-04-17 15:09:18 【问题描述】:

在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'

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

【问题讨论】:

from Animals.Mammals 将在您与 Animals 模块位于同一目录级别时工作。而且我认为您不需要在 __init__.py 中进行任何导入,除非您在执行 import Animals 时想要导入其他模块 您的意思是从Project/ 内部运行解释器还是从Animals 内部运行它?如果你有你描述的文件结构并从Project/ 运行解释器,它也应该使用空的__init__.py 【参考方案1】:

将以下代码放入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 的评论解释。)

【讨论】:

谢谢!这行得通。你知道这是否是构造__init__.py 文件的标准方法吗? 经常这样做 - 主要用于常用的类、函数,因此可以轻松导入它们而无需输入长导入路径。如果对您有帮助,请点赞并接受答案。 有人可以提供一个关于为什么会有'.'的参考吗?在导入的文件名之前?看看我几年前构建的一个包,@DarrenMcAffee 代码似乎应该可以正常工作。 这是一个非信息性的答案,因为它 1. 没有解释为什么用户代码有这样的问题 2. 它没有解释为什么解决方案可以解决问题。使用此答案的唯一方法是从中复制粘贴,它无助于理解发生的事情。请详细说明问题的根源,我很乐意支持这样的答案 通读这篇文章帮助我清楚地了解了问题的根本原因:python-notes.curiousefficiency.org/en/latest/python_concepts/…

以上是关于__init__.py 找不到本地模块的主要内容,如果未能解决你的问题,请参考以下文章

使用 pytest 运行测试时出现问题 - 在我自己的包中找不到模块

PyCharm 在 __init__.py 中找不到任何 OpenCV 函数的引用

找不到存储文件 __init__.py 翻译的语言环境路径

找不到模块'cx_Freeze__init__'

Cython cimport 找不到 .pxd 模块

无法导入模块:在工作文件中找不到模块,但在另一个文件中工作正常