通过C++;在BOOST_Python_模块宏外部将实例转换为Python 我想把一个TestObjt实例从C++代码传递到Python。此处发布的代码在CUT中产生错误:“没有为C++类型找到的ToyPython(按值)转换器:类TestObjr”。如果我移动对象创建并main_module.attr(“obj”)=obj < p>通过Boost将C++对象传递给Python。Python与它调用的上下文无关,具有相同的前提条件:必须对C++对象的类型注册一个Python转换器。

通过C++;在BOOST_Python_模块宏外部将实例转换为Python 我想把一个TestObjt实例从C++代码传递到Python。此处发布的代码在CUT中产生错误:“没有为C++类型找到的ToyPython(按值)转换器:类TestObjr”。如果我移动对象创建并main_module.attr(“obj”)=obj < p>通过Boost将C++对象传递给Python。Python与它调用的上下文无关,具有相同的前提条件:必须对C++对象的类型注册一个Python转换器。,python,c++,boost,boost-python,Python,C++,Boost,Boost Python,当我尝试传递带有或不带有boost::ptr的*TestObj时,也会发生类似的情况 testembed.py: import sfgame print("old x: " + str(obj.x)) obj.x = 10 print("new x: " + str(obj.x)) testobj.h class TestObj{ public: TestObj(); int x; int getX(); void setX(int xv); }; test

当我尝试传递带有或不带有boost::ptr的
*TestObj
时,也会发生类似的情况

testembed.py:

import sfgame

print("old x: " + str(obj.x))
obj.x = 10
print("new x: " + str(obj.x))
testobj.h

class TestObj{
public:
    TestObj();
    int x;
    int getX();
    void setX(int xv);
};
testobj.cpp

#include "TestObj.h"
TestObj::TestObj(){
}

int TestObj::getX(){
    return x;
}

void TestObj::setX(int xv){
    x = xv;
}
main.cpp

#include <boost/python.hpp>
#include "TestObj.h"

using namespace boost::python;

BOOST_PYTHON_MODULE(sfgame){
    class_<TestObj>("TestObj")
        .add_property("x", &TestObj::getX, &TestObj::setX)
        ;
}

int main(){
    Py_Initialize();

    object main_module = import("__main__");
    object main_namespace = main_module.attr("__dict__");

    TestObj obj;

    try{
        obj.setX(5);
        main_module.attr("obj") = obj;

        exec_file("testembed.py", main_namespace);
    }
    catch (const boost::python::error_already_set &){
        PyObject *ptype, *pvalue, *ptraceback;
        PyErr_Fetch(&ptype, &pvalue, &ptraceback);
        std::string error;
        error = boost::python::extract<std::string>(pvalue);
        std::cout << error << std::endl;
    }

    system("PAUSE");
    return 0;
}
#包括
#包括“TestObj.h”
使用名称空间boost::python;
BOOST_PYTHON_模块(sfgame){
类(“测试对象”)
.add_属性(“x”、&TestObj::getX、&TestObj::setX)
;
}
int main(){
Py_初始化();
对象主模块=导入(“\uuuu主模块”);
object main_namespace=main_module.attr(“uu dict_uu”);
TestObj-obj;
试一试{
obj.setX(5);
主模块属性(“obj”)=obj;
exec_文件(“testembed.py”,主_名称空间);
}
catch(const boost::python::error\u已设置&){
PyObject*ptype、*pvalue、*ptraceback;
PyErr_Fetch(&ptype,&pvalue,&ptraceback);
字符串错误;
error=boost::python::extract(pvalue);

标准::cout来自文件:

此宏在其使用范围内生成两个函数:extern“C”void initname()和void init_module_name(),其主体必须在宏调用之后


您需要从文档中调用
initsfgame();

此宏在其使用范围内生成两个函数:extern“C”void initname()和void init_module_name(),其主体必须在宏调用之后


您需要调用<代码> iTfsgAcMe(;)/<代码> ./p> < p>通过Boost将C++对象传递给Python。Python与它调用的上下文无关,具有相同的前提条件:必须对C++对象的类型注册一个Python转换器。 创建的实例时,to Python和from Python转换器将自动注册为类型
T
。宏仅声明一个Python模块初始化函数,Python将在导入模块时调用该函数。在这种特殊情况下,可以通过在传递之前执行以下任一操作来解决此问题将
TestObj
实例移植到Python:

  • main()
    中初始化解释器后,通过
    class
    暴露
    TestObj
  • 导入静态链接的
    sfgame
    模块。这需要通过将模块初始化函数显式添加到Python初始化表中。有关详细信息,请参阅答案
不建议直接调用模块初始化函数。直接调用时,不会创建模块本身,但将使用Boost.Python注册类型。导入模块后,将创建并初始化模块,从而再次注册类型。在Boost.Python的调试版本中,这将导致在发布版本中,它将打印一条警告


这里是一个完整的例子,它在嵌入时将C++对象传递给Python。在例子中,如果在静态链接<代码>示例模块中公开,垃圾邮件类型,并且<<代码>鸡蛋>代码>类型在

#包括
//模型。
结构垃圾邮件{};
结构蛋{};
BOOST_PYTHON_模块(示例)
{
名称空间python=boost::python;
python::class((“Spam”,python::init());
}
int main()
{
//为静态链接模块显式添加初始值设定项。
PyImport_AppendInittab(“示例”、&initexample);
//初始化Python。
Py_初始化();
名称空间python=boost::python;
尝试
{
//创建主模块。
python::object main_module=python::import(“_main__”);
python::object main_namespace=main_module.attr(“uu dict_uu”);
//导入示例模块,这将导致示例模块
//要调用的初始化函数,注册垃圾邮件类型。
//>>>导入示例
python::导入(“示例”);
//>>>spam=example.spam()
垃圾邮件;
主_名称空间[“垃圾邮件”]=垃圾邮件;
//公开egg,在主模块中定义它。
//>>>班级鸡蛋:通过
main_名称空间[“Egg”]=python::class_(“Egg”,python::init());
//>>>蛋=蛋()
鸡蛋;
main_名称空间[“egg”]=egg;
//验证变量及其类型。
python::exec(
“导入示例\n”
断言(isinstance(垃圾邮件,例如.spam))\n
“断言(isinstance(egg,egg))\n”,
主名称空间);
}
catch(constpython::error\u已经\u集&)
{
PyErr_Print();
返回1;
}
//不要使用Boost.Python调用Py_Finalize()。
}

通过Boost将C++对象传递给Python。Python与调用它的上下文无关,它具有相同的前提条件:必须为C++对象类型注册一个Python转换器。 创建的实例时,to Python和from Python转换器将自动注册为类型

T
。宏仅声明一个Python模块初始化函数,Python将在导入模块时调用该函数。在这种特殊情况下,可以通过在传递之前执行以下任一操作来解决此问题将
TestObj
实例移植到Python:

  • main()
    中初始化解释器后,通过
    class
    暴露
    TestObj
  • 导入静态链接的
    sfgame
    模块。这需要通过将模块初始化函数显式添加到Python初始化表中。有关详细信息,请参阅答案
不建议直接调用模块初始化函数。直接调用时,不会创建模块本身,但类型将在Boost.Python中注册