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