__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
说明:
它找不到模块,因为它不知道要搜索哪个目录才能找到文件Mammals
和Birds
。您假设子文件夹 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 运行测试时出现问题 - 在我自己的包中找不到模块