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

2024-04-20 04:57:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个Windows DLL,用于另一个程序,我希望在Python脚本中有一些C++函数调用Python函数。C++函数位于实例化对象中;当对象调用脚本时,脚本也应该能够调用该对象的函数。我一直在努力做到这一点Boost.Python但是文件Boost.Python我对如何实现这一点非常模糊,我发现的一些教程相当于“。。。然后画出猫头鹰的其他部分。”

(我也听说过一些关于使用pybind的东西,但在这个开发阶段,我只限于MSVC 9.0和pre-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);
}

然后是剧本:

^{pr2}$

我假设我需要把C++对象的实例传递给Python脚本,理想的是脚本或Python解释器是一个对象,在DLL卸载之前我会一直保存它。我对调用脚本的具体细节也很模糊。我的搜寻毫无结果,令人沮丧。在

编辑

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

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

但是,我也不能调用类中的函数,因为Python需要一个类的实例来调用它们!如果对象创建类的自己的副本,它也会在死后调用该类的析构函数,从而导致运行DLL的主程序出现各种问题。在


Tags: 对象实例函数no脚本messagefooinit