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