使用Boost.Python的C ++嵌入Python

时间:2018-07-30 17:53:37

标签: python c++ visual-c++ boost boost-python

因此,我正在编写一个Windows DLL以在另一个程序中使用,并且我想让某些C ++函数在Python脚本中调用Python函数。 C ++函数位于实例化的对象中;当对象调用脚本时,脚本也应该能够调用该对象的函数。我一直在尝试通过Boost.Python来做到这一点,但是Boost.Python的文档对于如何实现这一点非常含糊,我发现的一些教程都等同于“ ...”,然后绘制其余的猫头鹰。”

(我也听说过有关使用pybind的事情,但是在此开发阶段,我仅限于MSVC 9.0和C11之前的版本)。只是为了到达我所在的地方,这是一段艰难的艰难跋涉。

因此,基本上,我(非常粗略地)沿以下方向看:

BOOST_PYTHON_MODULE(PythonModule)
{
    class_<CPythonModule, boost::noncopyable>("Functions", boost::python::no_init)
    .def("foo", &CPythonModule::foo)
}

void CPythonModule::foo(string message)
{
    some_function_that_prints_things(message);
}

int main_module_method()
{
    Py_Initialize();

    ???

    call_python_script_function(script.py, bar);
}

然后是脚本:

import PythonModule
def bar:
    PythonModule.Functions.foo("Foo bar")

我假设我需要将C ++对象的实例传递给Python脚本,并且理想情况下,脚本或Python解释器将是在DLL卸载之前一直保留的对象。我还不太了解调用该脚本的实际细节。我的搜索无济于事。

编辑

通过一些复杂的工作,看来我最大的未知数是想出如何将对象的当前实例发送到Python脚本并调用该对象的函数,而无需在Python中创建新对象。 通过这一行,我可以使对象不可初始化:

class_<CPythonModule, boost::noncopyable>("Functions", boost::python::no_init)

但是,我随后也不能调用类中的函数,因为Python需要类的实例才能调用它们!如果对象创建了自己的类的副本,则对象在死亡时也会调用其析构函数,从而在运行DLL的主程序中引起各种问题。

0 个答案:

没有答案