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

时间:2019-01-22 22:17:21

标签: python package setup.py pybind11

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

我现在想在一个子模块(例如subA)中添加一些纯Python代码,以便我也可以这样做

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代码的东西?优选地,在相同的子模块内,但是至少在相同的包装内。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

一种简单的方法是将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