__init__.py 在同一目录中找不到模块[重复]
Posted
技术标签:
【中文标题】__init__.py 在同一目录中找不到模块[重复]【英文标题】:__init__.py does not find modules in same directory [duplicate] 【发布时间】:2017-12-01 18:27:59 【问题描述】:我需要有关如何在 python 包中组织源代码的帮助 - 我已经在网上学习了几个教程(尤其是 this one),但它并没有按照解释和我想象的那样工作.
我想创建一个名为binaryio
的python 包。它应该提供两个名为 BinaryReader
和 BinaryWriter
的类,我希望用户能够使用它们导入
from binaryio import BinaryReader
from binaryio import BinaryWriter
因此我创建了我的存储库和包目录结构如下:
binaryio(存储库根) binaryio(包根目录) __init__.py(见下文) binaryreader.py(包含BinaryReader
类)
binarywriter.py(包含BinaryWriter
类)
setup.py(包含setuptools.setup
调用)
.gitignore、README.md、许可证、...
如您所见,这些类位于不同的文件中,因为我已经习惯了(来自 C# 背景)。我不确定这是否是一个好主意,因为模块是 Python 中的“单元”——否则将所有类压缩到一个巨大的文件中对我来说似乎不合逻辑。
__init__.py 看起来如下导入这些类,使(据我了解)from binaryio import BinaryReader
导入可能供用户稍后使用:
from binaryreader import BinaryReader
from binarywriter import BinaryWriter
但是,当我在本地安装包(似乎工作正常)并尝试import binaryio
时,我收到以下错误:
>>> import binaryio
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "D:\Projects\Git\binaryio\binaryio\__init__.py", line 1, in <module>
from binaryreader import BinaryReader
ModuleNotFoundError: No module named 'binaryreader'
显然,我的 __init__.py 文件有问题。我不明白这一点,因为 binaryreader.py 文件又名模块存在于与您在上面看到的相同的文件夹中。有趣的是,我的 IDE(PyCharm,已将包根设置为源文件夹)不会抱怨其中的语句并且可以解析所有引用。
我在这里做错了什么?根据上面链接的教程,将一个文件放入 xyz.py 并带有一个名为 Abc
的类,然后将 from xyz import Abc
写入 __init__.py 应该可以工作,但显然它不适合我。
【问题讨论】:
本地安装包=使用打包工具还是直接解包? @bakatrouble 在存储库根目录下,我运行pip install .
,然后尝试以交互模式导入。
【参考方案1】:
您的代码适用于 Python 2.x,但不适用于 3.x,因为不同的相对导入语法:没有点,Python 2.x 将在模块根 和当前包中查找模块,并且 Python 3.x 将在模块根目录中显示仅。
您要使用的导入语句如下:
from binaryio.binaryreader import BinaryReader
from binaryio.binarywriter import BinaryWriter
在没有“futures”的情况下在 Python 2.x 和 3.x 中工作
【讨论】:
这是否意味着 Xatyrian 的答案只有前导点与此等价,因为 _init_.py 已经在 binaryio 文件夹?还是该语法在 Python 2 中根本不起作用? 是的,几乎是等价的。区别在于:对于 Python 2.x,Xatyrian 的 sn-p 需要from __future__ import absolute_import
,如果 binaryio
包不在模块根目录中,我的回答将不起作用。
谢谢,我怀疑是因为你上次关于“期货”的说法。我接受您的回复作为答案,因为它解释了背后的原因。【参考方案2】:
我认为您需要在导入语句中添加一个点:
from .binaryreader import BinaryReader
from .binarywriter import BinaryWriter
【讨论】:
效果很好。但现在我真的很感兴趣为什么 I 必须用点显式命名当前目录,而我在网上找到的所有其他示例都没有。以及为什么它实际上与非点版本有所不同(现在查找,因为没有人告诉我那里 is 有区别......) 这是python 2和python 3的区别。 天哪,我又掉进了“网络上的教程没有指定 Python 版本”的陷阱 :( 感谢您清除它!以上是关于__init__.py 在同一目录中找不到模块[重复]的主要内容,如果未能解决你的问题,请参考以下文章
PyCharm 在 __init__.py 中找不到任何 OpenCV 函数的引用
使用 pytest 运行测试时出现问题 - 在我自己的包中找不到模块