__init__.py在同一目录中找不到模块

时间:2017-06-28 11:54:19

标签: python python-packaging

我需要有关如何在python包中组织源代码的帮助 - 我已经在网上(尤其是this one)上关于如何执行此操作的几个教程,但它不能解释如何以及我如何工作想象它。

我想创建一个名为binaryio的python包。它应该提供两个名为BinaryReaderBinaryWriter的类,我希望用户可以使用

导入
from binaryio import BinaryReader
from binaryio import BinaryWriter

因此,我创建了我的存储库和包目录结构,如下所示:

  • binaryio(存储库根目录)
    • binaryio(包根)
      • __ init __。py (下面的s。)
      • binaryreader.py (包含BinaryReader类)
      • binarywriter.py (包含BinaryWriter类)
    • setup.py (包含setuptools.setup电话)
    • .gitignore README.md LICENSE ,...

正如您所看到的,这些类是在我习惯的单独文件中(来自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 文件aka模块存在于您上面看到的同一文件夹中。有趣的是,我的IDE(PyCharm,将包根设置为源文件夹)不会抱怨其中的语句并且可以解析所有引用。

我在这里做错了什么?根据上面链接的教程,将文件放入 xyz.py 并使用名为Abc的类,然后将from xyz import Abc写入 __ init __。py 应该工作,但显然它不适合我。

2 个答案:

答案 0 :(得分:5)

您的代码适用于Python 2.x,但不适用于3.x,因为相对导入语法不同:没有dot,Python 2.x会在模块根当前包中寻找模块,并且Python 3.x在模块根目录中只显示

您要使用的导入语句包括:

from binaryio.binaryreader import BinaryReader
from binaryio.binarywriter import BinaryWriter

适用于Python 2.x和3.x,没有&#34;期货&#34;

答案 1 :(得分:3)

我认为您需要在导入语句中添加一个点:

from .binaryreader import BinaryReader
from .binarywriter import BinaryWriter