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



假设我有一个基于 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

我已经为这样一个项目制作了一个MCVE,希望能尽可能清楚地说明这一点。

如果我添加一个文件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++模块构建到公共模块之外的受保护模块中,并将此受保护模块导入公共模块。

例如,将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

最新更新