[求助]:Python如何访问C++自定义的结构(类)的对象
使用的是Boost.Python库,在程序中有一个正在运行的自定义结构(类)的对象,希望传入到Python解释器中进行运算。不知道这个功能怎么实现,祈求高手相助!
[解决办法]
感觉有必要为本版培养一位有C++和Python交互经验并热爱灌水的网友了……
[解决办法]
不会C++,只会点Python
友情帮你UP了
[解决办法]
为了能在Python中使用自定义的类型。
1 写一个Python扩展,把想在Python中操作的类注册到Python中。使用boost库这一步很方便。
简单的代码示例如下:
//operand.h
struct Operand{
Operand(int l,int r)
:lhs(l),rhs(r){
}
int lhs ;
int rhs ;
} ;
int Operator(Operand*) ;
//operand.cpp
#include "Operand.h "
#include <iostream>
int Operator(Operand* op){
std::cout < < "Operator(Operand*) " < <std::endl ;
return op-> lhs + op-> rhs ;
}
//main.cpp
#include "Operand.h "
#include <boost/python.hpp>
using namespace boost::python ;
BOOST_PYTHON_MODULE(Operand)
{
class_ <Operand> ( "Operand ",init <int,int> ())
.def_readwrite( "lhs ",&Operand::lhs)
.def_readwrite( "rhs ",&Operand::rhs)
;
def( "Operator ",Operator) ;
}
2 写一段Python代码。如下:
//test.py
from Operand import *
def add(Op):
print 'test.py '
print type(Op)
return Op.lhs+Op.rhs
3 写使用Python的程序,这一步也使用boost
//operand.h
struct Operand{
Operand(int l,int r)
:lhs(l),rhs(r){
}
int lhs ;
int rhs ;
} ;
//main.cpp
#include "Operand.h "
#include <boost/python.hpp>
using namespace boost::python ;
#include <iostream>
int main(){
Py_Initialize() ;
try{
object main_module((
handle <> (borrowed(PyImport_AddModule( "__main__ ")))));
object main_namespace = main_module.attr( "__dict__ ");
handle <> ignored((PyRun_String(
"from test import *\n "
, Py_file_input
, main_namespace.ptr()
, main_namespace.ptr())
));
object func=main_module.attr( "add ") ;
Operand oper(2,4) ;
object param(oper) ;
PyObject* pArgs = PyTuple_New( 1 ) ;
Py_INCREF( param.ptr() ) ;
PyTuple_SetItem( pArgs , 0 , param.ptr() ) ;
handle <> result( PyObject_CallObject(func.ptr(),pArgs ) ) ;
Py_DECREF( pArgs ) ;
int value=extract <int> ( object(result)) ;
std::cout < <value < <std::endl ;
}
catch( error_already_set ){
PyErr_Print() ;
}
Py_Finalize() ;
return 0 ;
}
还有一些引用计数的代码放在中间比较讨厌。boost对嵌入Python做的还不是很方便。
用Rational Purify了一下。没有内存泄漏。
有问题再讨论。一起学习前进。