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