在 Cython 中使用和导入/导入嵌套包

D. *_*arn 5 python cython python-3.x

是否可以在 Cython 扩展中使用嵌套包(又名子目录),如果可以,我该怎么做?

Cython 似乎不允许在顶级包之外进行相对导入/cimport。所以,假设我有以下 Cython 项目结构:

/lib_interface.pyx
/lib_interface.pxd // the top level source files
/submodule/__init__.pxd
/submodule/submodule_code.pyx
/submodule/submodule_code.pxd
Run Code Online (Sandbox Code Playgroud)

让我们想象一下我们生成的 Cython 库被称为 SomeLib,所以在 Python 中我希望这样做: from SomeLib.submodule import SomeClass

但这会导致错误说“SomeLib.submodule”不是一个包。

我尝试 cimporting 并将子模块导入 lib_interface.pxd,但这从来没有帮助。

Pro*_*osh 1

如果您想将内容导入到另一个 Cython 模块中,则__init__.pxd每个目录都需要 。如果您还想将其导入Python,请__init__.py在每个级别添加常用的。所以你的目录结构如下所示:

/lib_interface.pyx
/lib_interface.pxd
/__init__.py
/submodule/__init__.pxd
/submodule/submodule_code.pyx
/submodule/submodule_code.pxd
/submodule/__init__.py
Run Code Online (Sandbox Code Playgroud)

这位于__init__.py子模块目录下:

from somelib.submodule.submodule_code import MyClass

__all__ = [MyClass]
Run Code Online (Sandbox Code Playgroud)

现在您应该能够将其导入为from somelib.submodule import MyClass.