10

我需要有关如何在 python 包中组织源代码的帮助——我已经在网上学习了几个教程(尤其是这个),但它并没有按照解释和我想象的那样工作。

我想创建一个名为binaryio. 它应该提供两个名为的类BinaryReaderBinaryWriter我希望用户能够使用它们导入

from binaryio import BinaryReader
from binaryio import BinaryWriter

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

  • binaryio(存储库根)
    • binaryio(包根)
      • __init__ .py(如下)
      • binaryreader.py(包含BinaryReader类)
      • binarywriter.py(包含BinaryWriter类)
    • setup.py(包含setuptools.setup调用)
    • .gitignoreREADME.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应该可以工作,但显然它不适合我。

4

2 回答 2

9

您的代码适用于 Python 2.x,但不适用于 3.x,因为不同的相对导入语法:没有点,Python 2.x 将在模块根目录当前包中查找模块,而 Python 3.x 将在模块中查找根。

您要使用的导入语句是:

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

可在 Python 2.x 和 3.x 中使用,无需“期货”

于 2017-06-28T11:55:41.143 回答
6

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

from .binaryreader import BinaryReader
from .binarywriter import BinaryWriter
于 2017-06-28T12:01:44.460 回答