__init__.py 在同一目录中找不到模块
__init__.py does not find modules in same directory
我需要有关如何在 python 包中组织源代码的帮助 - 我已经按照网络上的几个教程(尤其是 this one)学习如何这样做,但它没有按照说明和我的想象工作。
我想创建一个名为 binaryio
的 python 包。它应该提供两个 classes 命名为 BinaryReader
和 BinaryWriter
我希望用户能够导入
from binaryio import BinaryReader
from binaryio import BinaryWriter
因此我创建了我的存储库和包目录结构如下:
- binaryio(存储库根目录)
- binaryio(包根目录)
- __init__.py(见下文)
- binaryreader.py(包含
BinaryReader
class)
- binarywriter.py(包含
BinaryWriter
class)
- setup.py(包含
setuptools.setup
调用)
- .gitignore, README.md, LICENSE, ...
如您所见,classes 位于单独的文件中,因为我已经习惯了(来自 C# 背景)。我不确定这是否是个好主意,因为模块是 Python 中的 "unit" - 但除此之外,将所有 classes 压缩到一个大文件中对我来说似乎不合逻辑。
__init__.py 看起来如下导入那些 classes,使(据我了解)用户可以导入 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 中 class 命名为 Abc
然后将 from xyz import Abc
写入 __init__.py 应该可以,但显然不适合我。
您的代码适用于 Python 2.x,但不适用于 3.x,因为相对导入语法不同:没有点,Python 2.x 看起来对于模块根和当前包中的模块,Python3.x将在模块根仅中查找。
您要使用的导入语句是这些:
from binaryio.binaryreader import BinaryReader
from binaryio.binarywriter import BinaryWriter
在 Python 2.x 和 3.x 中都有效,没有 "futures"
我认为您需要在导入语句中添加一个点:
from .binaryreader import BinaryReader
from .binarywriter import BinaryWriter
我需要有关如何在 python 包中组织源代码的帮助 - 我已经按照网络上的几个教程(尤其是 this one)学习如何这样做,但它没有按照说明和我的想象工作。
我想创建一个名为 binaryio
的 python 包。它应该提供两个 classes 命名为 BinaryReader
和 BinaryWriter
我希望用户能够导入
from binaryio import BinaryReader
from binaryio import BinaryWriter
因此我创建了我的存储库和包目录结构如下:
- binaryio(存储库根目录)
- binaryio(包根目录)
- __init__.py(见下文)
- binaryreader.py(包含
BinaryReader
class) - binarywriter.py(包含
BinaryWriter
class)
- setup.py(包含
setuptools.setup
调用) - .gitignore, README.md, LICENSE, ...
- binaryio(包根目录)
如您所见,classes 位于单独的文件中,因为我已经习惯了(来自 C# 背景)。我不确定这是否是个好主意,因为模块是 Python 中的 "unit" - 但除此之外,将所有 classes 压缩到一个大文件中对我来说似乎不合逻辑。
__init__.py 看起来如下导入那些 classes,使(据我了解)用户可以导入 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 中 class 命名为 Abc
然后将 from xyz import Abc
写入 __init__.py 应该可以,但显然不适合我。
您的代码适用于 Python 2.x,但不适用于 3.x,因为相对导入语法不同:没有点,Python 2.x 看起来对于模块根和当前包中的模块,Python3.x将在模块根仅中查找。
您要使用的导入语句是这些:
from binaryio.binaryreader import BinaryReader
from binaryio.binarywriter import BinaryWriter
在 Python 2.x 和 3.x 中都有效,没有 "futures"
我认为您需要在导入语句中添加一个点:
from .binaryreader import BinaryReader
from .binarywriter import BinaryWriter