因此,我正在编写一个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的主程序中引起各种问题。