如何将 Python 代码混合到 Python 扩展模块中

How to mix Python code into a Python extension module

假设我有一个基于 Pybind11 扩展的 Python 包 mymodule,其中以下代码在 运行 python setup.py install:

之后非常有效
from mypackage.subA import foo  # foo is written in C++.
from mypackage.subB import bar  # Same for bar.

我现在想在其中一个子模块中添加一些纯 Python 代码,比如说 subA,这样我也可以做

from mypackage.subA import pure_python_func

I've made an MCVE of such a project 希望尽可能清楚地说明这一点。

如果我添加一个文件 mypackage/subA.py,其中我写了 pure_python_func(并添加一个空的 mypackage/__init__.py),我可以导入 Python 部分,但是扩展名模块消失。即

from mypackage.subA import pure_python_func  # Works
from mypackage.subA import foo  # Fails
from mypackage.subB import bar  # Fails

我的问题是如何在同一个包中得到一个同时具有扩展代码 Python 代码的东西?最好在相同的子模块中,但至少在相同的包中。非常感谢任何帮助!

一种简单的方法是将 C++ 模块构建到 public 模块之外的受保护模块中,然后将此受保护模块导入到 public 模块中。

例如,将 mypackage.subA.foo 改成 _mypackage._foo 构建。然后文件 mypackage/subA/__init__.py 看起来像这样:

from _mypackage._foo import *
from mypackage.subA._pythonModule import *

# Any other python code could be imported here as well