我尝试使用Pybind11
从包含main()
函数的C代码中调用python函数。但我发现可用的参考资料很少。大多数现有文档都在讨论相反的方向,即从Python调用C。
有没有完整的例子说明如何做到这一点?我找到的唯一参考是:https://github.com/pybind/pybind11/issues/30
但它的信息很少。
我尝试使用Pybind11
从包含main()
函数的C代码中调用python函数。但我发现可用的参考资料很少。大多数现有文档都在讨论相反的方向,即从Python调用C。
有没有完整的例子说明如何做到这一点?我找到的唯一参考是:https://github.com/pybind/pybind11/issues/30
但它的信息很少。
3条答案
按热度按时间qkf9rpyu1#
你问题的答案其实有两部分:一个是关于从C调用Python函数,另一个是关于嵌入解释器。
在pybind11中调用一个函数只不过是把这个函数放到一个
pybind11::object
变量中,你可以在这个变量上调用operator()
来尝试调用这个对象(它不一定是一个函数,只要是一个可调用的函数就行了:例如,它也可以是一个带有__call__
方法的对象)。例如,要从C代码调用math.sqrt(2)
,您可以用途:或者你可以把它浓缩成
问题的第二部分涉及到如何从C可执行文件中实现这一点。当构建一个可执行文件时(即当你的C代码包含
main()
时),你必须先将Python解释器嵌入到你的二进制文件中,然后才能用Python做任何事情(比如调用Python函数)。嵌入式支持是当前pybind11
master
分支(将成为2.2版本)中增加的一个新特性,下面是一个基本的例子,它启动一个嵌入式Python解释器并调用一个Python函数(math.sqrt
):输出:
调用函数和嵌入的更多示例和文档分别位于http://pybind11.readthedocs.io/en/master/advanced/pycpp/object.html和http://pybind11.readthedocs.io/en/master/advanced/embedding.html。
enyaitl32#
jasons的回答非常中肯,但是我想添加一个稍微复杂(并且简洁)的例子,用
numpy
输入调用python方法,我想展示两点:1.我们可以使用
py::reinterpret_borrow<py::function>
将py::object
转换为py::function
1.我们可以输入
std::vector
,它会自动转换为numpy.array
请注意,用户有责任确保
PyModule.attr
实际上是一个python函数,还要注意,类型转换适用于各种c++
类型(详细信息请参见here)。在这个例子中,我想使用
scipy.optimize.minimize
方法,它的起点是从c++接口提供的。使用Python脚本
py_src/exec_numpy.py
希望这对某人有帮助!
brqmpdu13#
1.项目结构