gpt4 book ai didi

c++ - 在 python 中公开 C++ 函数并在 C++ 中嵌入 python

转载 作者:太空狗 更新时间:2023-10-29 22:23:31 27 4
gpt4 key购买 nike

我的应用程序有一些事件,每个事件都可以有一些 Action 。这些操作是用 C++ 实现的。我想把那些核心功能暴露给python,用python写action。优点是我可以修改 Action 而无需重新编译。例如:

CppClass o;

// --- this is a action----
o.f1();
o.f2();
// ------------------------

使用 python 编写操作脚本:

def action1(o):
o.f1()
o.f2()

在 c++ 中,使用解释器运行此脚本,找到 action1 并使用从 c++ 对象转换的 PyObject 调用它。实际上,我并没有将f1() & f2()暴露给python,我只是用python重新组合了action的定义,所有函数都是由c++二进制代码运行的。请注意,我不必在 python 中给出 f1() 和 f2() 的定义。

问题是:我如何公开全局函数?比如:

def action2():
gf1()
gf2()

boost::python可以暴露函数,但不同的是,它需要编译一个DLL文件,而main()属于python脚本。当然我可以让全局函数成为类的静态成员,但我只是想知道。请注意,我必须在 python 中给出 gf1() 和 gf2() 的定义。

Jython 可以轻松做到这一点:只需在 python 代码中导入 Xxx 并调用 Xxx.gf1() 即可。但是在 cython 中,我如何在 python 中定义 gf1() ?这是一种扩展,但是扩展需要先编译Xxx。似乎唯一的方法是将 gf() 变成一个类?

最佳答案

已解决。 boost::python 的文档真的很差......

例如:暴露函数

void ff(int x, int y)
{
std::cout<<x<<" "<<y<<std::endl;
}

到 python :

import hello
def foo(x, y)
hello.ff(x, y)

您需要将其公开为一个模块:

BOOST_PYTHON_MODULE(hello)
{
boost::python::def("ff", ff, boost::python::arg("x"), boost::python::arg("y"));
}

但这仍然不是一个“全局函数”,所以将它暴露给 python 的主要作用域:

BOOST_PYTHON_MODULE(__main__)
{
boost::python::def("ff", ff, boost::python::arg("x"), boost::python::arg("y"));
}

然后你可以写:

def foo(x, y)
ff(x, y)

关于c++ - 在 python 中公开 C++ 函数并在 C++ 中嵌入 python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9058785/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com