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

Ray*_*Ray 7 python python-packaging

我需要有关如何在python包中组织源代码的帮助-我已经在网络上关注了一些教程(尤其是教程),但该方法并没有按照说明以及我的想象进行。

我想创建一个名为的python包binaryio。它应该提供两个类命名BinaryReaderBinaryWriter我希望用户能够与进口

from binaryio import BinaryReader
from binaryio import BinaryWriter
Run Code Online (Sandbox Code Playgroud)

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

  • 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
Run Code Online (Sandbox Code Playgroud)

但是,当我在本地安装该软件包(似乎工作正常)并尝试到时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'
Run Code Online (Sandbox Code Playgroud)

显然,我的__init__.py文件出了点问题。我不明白这一点,因为binaryreader.py文件又名模块存在于与您在上面看到的相同的文件夹中。有趣的是,我的IDE(PyCharm,已将包根目录设置为源文件夹)不会抱怨其中的语句,并且可以解析所有引用。

我在这里做错了什么?根据上面的教程链接,把一个文件分成xyz.py与命名类Abc,然后写from xyz import Abc__init__.py应该工作,但显然它不适合我。

bak*_*ble 6

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

您要使用的导入语句如下:

from binaryio.binaryreader import BinaryReader
from binaryio.binarywriter import BinaryWriter
Run Code Online (Sandbox Code Playgroud)

在Python 2.x和3.x中都可以使用,没有“未来”


Xat*_*ian 6

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

from .binaryreader import BinaryReader
from .binarywriter import BinaryWriter
Run Code Online (Sandbox Code Playgroud)

  • 这是python 2和python 3之间的区别。 (2认同)