C++ 暴露C++;函数,并将python嵌入C++;

C++ 暴露C++;函数,并将python嵌入C++;,c++,python,C++,Python,我的应用程序有一些事件,每个事件都可以有一些操作。这些动作是用C++实现的。我想向python公开这些核心函数,并使用python编写操作。优点是我可以修改操作而无需重新编译。例如: CppClass o; // --- this is a action---- o.f1(); o.f2(); // ------------------------ 使用python编写操作脚本: def action1(o): o.f1() o.f2() 在C++中,使用解释器运行这个脚本

我的应用程序有一些事件,每个事件都可以有一些操作。这些动作是用C++实现的。我想向python公开这些核心函数,并使用python编写操作。优点是我可以修改操作而无需重新编译。例如:

CppClass o;

// --- this is a action----
o.f1();
o.f2();
// ------------------------
使用python编写操作脚本:

def action1(o):
    o.f1()
    o.f2()
在C++中,使用解释器运行这个脚本,查找Acto1并用一个从C++对象转换的PyObject调用它。事实上,我还没有将f1()和f2()暴露给Python,我只是用Python重新定义动作的定义,所有的函数都是用C++二进制代码运行的。注意,我没有给出python中f1()&f2()的定义

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

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


Jython可以很容易地做到这一点:只需在python代码中导入Xxx并调用Xxx.gf1()即可。但是在cython中,我如何在python中定义gf1()?这是一种扩展,但扩展需要提前编译Xxx。看来唯一的办法是将gf()变成一个类?

您可能还想看看

Cython的主要功能是将Python代码的一个子集翻译成C 或C++代码来构建本机代码Python扩展。因此,, 它允许C/C++代码与非常简洁的Python语言接口 语法

提供 如何从Python调用简单C++类的一个很好的例子:

除了创建扩展,Cython还可以生成C/C++ 嵌入Python解释器的代码,因此不需要构建
并发送一个外部DLL。有关详细信息,请参见:

已解决。python的文档真的很差

例如:expose函数

void ff(int x, int y)
{
    std::cout<<x<<" "<<y<<std::endl;
}
您需要将其作为模块公开:

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)

FPython是用Python 2 .xAPI编写的C++ LIB。p> 调用python函数:ffpython.call(“fftest”、“test_stl”、a1、a2、a3); RC++ C++类:

ffpython.reg_class<foo_t, PYCTOR(int)>("foo_t")
        .reg(&foo_t::get_value, "get_value")
        .reg(&foo_t::set_value, "set_value")
        .reg(&foo_t::test_stl, "test_stl")
        .reg_property(&foo_t::m_value, "m_value");
ffpython.reg_类(“foo_t”)
.reg(&foo\u t::获取值,“获取值”)
.reg(&foo\u t::set\u value,“set\u value”)
.reg(&foo\u t::test\u stl,“test\u stl”)
.reg_属性(&foo_t::m_值,“m_值”);

您见过SWIG()吗?不知道如何使用SWIG。顺便说一句,我在它的网站上找不到api(比如SWIG_NewPointerObj)文档,你不写SWIG调用。你在C++文件上运行它(几乎是),它会为你生成胶水。我必须编译一个lib,然后我可以在python中使用这个lib来定义gf(),编译lib不是我想要的。你现在如何向python公开类?使用Python/CAPI?
ffpython.reg_class<foo_t, PYCTOR(int)>("foo_t")
        .reg(&foo_t::get_value, "get_value")
        .reg(&foo_t::set_value, "set_value")
        .reg(&foo_t::test_stl, "test_stl")
        .reg_property(&foo_t::m_value, "m_value");