鏂規(guī)硶涓錛?/strong>
void fun1()
{
Py_Initialize();
PyObject *pModule = PyImport_ImportModule("helloworld");
handle<>_module(pModule);
object main_module(_module);
// 瀵煎嚭C++綾誨埌python涓?/span>
main_module.attr("Demo") = class_ <Demo>("Demo") // 閫氳繃boost::python涓殑class_灝咰++綾誨寘瑁呮垚object綾誨瀷錛屽洜涓簆ython涓墍鏈夌被鍨嬮兘鏄痮bject
.def("setVal", &Demo::setVal)
.def("setName", &Demo::setName)
;
// 閫氳繃boost::python鎻愪緵鐨勬ā鏉垮嚱鏁皃tr錛屾潵灝咲emo瀵硅薄浼犲叆python
Demo a;
main_module.attr("test") = object(ptr(&a));
std::cout <<"涔嬪墠:"<< a.getName() << " " << a.getVal()<<endl;
call_method<void>(pModule , "fun2");
std::cout <<"涔嬪悗:"<< a.getName() << " " << a.getVal()<<endl;
// 閫氳繃python鍑芥暟榪斿洖C++瀵硅薄
Demo tmp = call_method<Demo>(pModule , "ReturnCppClass");
std::cout << tmp.getName() << " " << tmp.getVal() <<endl;
}
helloworld.py鑴氭湰鍐呭錛?br />def fun2():
tmp = test;
tmp.setVal(12345);
tmp.setName("2011-5-19");
def ReturnCppClass():
tmp = Demo();
tmp.setName('123456789')
tmp.setVal(99);
return tmp;
1.璇彞main_module.attr("test") = object(ptr(&a)); 涓殑"test"鏄痑瀵硅薄鍦ㄨ剼鏈腑鐨勫埆鍚嶏紝浜庢槸鑴氭湰涓彲浠ョ洿鎺ラ氳繃test鍚嶅瓧鎿嶄綔C++瀵硅薄銆?br />2.Demo tmp = call_method<Demo>(pModule , "ReturnCppClass");鏉ュ疄鐜板湪python涓垱寤篊++瀵硅薄錛屽茍涓旇繑鍥炲埌C++涓?br />
鏂規(guī)硶浜岋細
閫氳繃鏅鴻兘鎸囬拡瀹炵幇C++瀵硅薄鐨勫鍏?strong>
typedef boost::shared_ptr < Demo > Demo_ptr;
void fun2()
{
Py_Initialize();
Demo_ptr spD1(new Demo);
spD1->setName("NULL");
spD1->setVal(0);
try
{
PyObject *pModule = PyImport_ImportModule("helloworld");
register_ptr_to_python <Demo_ptr>(); // 娉ㄥ唽鍙兘鎸囬拡
handle<>* _module;
_module = new handle<>(pModule);
object main_module(*_module);
object dictionary = main_module.attr("__dict__");
dictionary["Demo"] = class_ <Demo>("Demo")
.def("setVal", &Demo::setVal)
.def("setName", &Demo::setName)
;
main_module.attr("DemoObj") = spD1; // 娣誨姞鏅鴻兘鎸囬拡鍒拌剼鏈紝騫墮噸鍛藉悕
call_method<void>(pModule , "SetObj"); // 鍦ㄨ剼鏈腑閫氳繃鎿嶇旱鏅鴻兘鎸囬拡鏉ユ帶鍒跺璞?/span>
std::cout << a.getName() << " " << a.getVal()<<endl;
}
catch (error_already_set)
{
PyErr_Print();
}
std::cout << "spD1->getName(): " << spD1->getName() <<std::endl;
std::cout << "spD1->getVal(): " << spD1->getVal() <<std::endl;
}
鑴氭湰鍐呭錛?br />def SetObj():
DemoObj.setVal(100);
DemoObj.setName('hello');
1.register_ptr_to_python <Demo_ptr>(); 娌℃湁榪欏彞榪愯鏃朵細寰楀埌閿欒銆傚叧浜巖egister_ptr_to_python錛宐oost涓殑瑙i噴鏄細
“a function template which registers a conversion for smart pointers to Python”
2.dictionary["Demo"] = class_ <Demo>("Demo")
.def("setVal", &Demo::setVal)
.def("setName", &Demo::setName)
;
涓庢柟娉曚竴涓殑錛?br />main_module.attr("Demo") = class_ <Demo>("Demo")
.def("setVal", &Demo::setVal)
.def("setName", &Demo::setName)
;
鏁堟灉涓鏍楓?br />
-----------------------------------------------------------------------------------
浠ヤ笂灝辨槸鍏充簬濡備綍灝咰++瀵硅薄浼犲叆python鐨勪竴鐐逛範(fàn)寰楋紝濡傛湁浠諱綍閿欒錛屾湜涓嶆儨鎸囨
-----------------------------------------------------------------------------------
P.S.: cppblog鎻愪緵鐨勭紪杈戝櫒涓嶅ソ鐢?img src ="http://www.shnenglu.com/zhaoyg/aggbug/147885.html" width = "1" height = "1" />
]]>