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