随笔 - 67  文章 - 79  trackbacks - 0
<2008年3月>
2425262728291
2345678
9101112131415
16171819202122
23242526272829
303112345

常用链接

留言簿(1)

随笔档案

文章档案

相册

搜索

  •  

最新评论

阅读排行榜

评论排行榜

python c api 能方便的将C函数导入到python
而包装c++ 类就不是很容易了  直接导出对象就更难了
用boost python能容易点  经过尝试总结了些方法
主要就是运用宏 BOOST_PYTHON_MODULE(pySample) 会自动产生一个initpySample 函数 在Py_Initialize()后调用 就可以转换c++对象到python 对象
register_ptr_to_python< pSample >(); 能将C指针(boost 建议使用智能指针对象)转换到python对象
我只是做了一小点尝试 对python c api 的掌握还很有限 下面的代码说明了如何导入c++对象
定义C++ 类 "sample.h"

#include <boost/smart_ptr.hpp>
#include 
<boost/python.hpp>
class sample
{
    
int m_value;
public:
    
int GetValue();
    
void SetValue(int v);
    
    sample(
int v=0);
    
~sample(void);
};
typedef boost::shared_ptr
<sample> pSample;
实现sample类的方法 "sample.cpp"
#include "sample.h"
#include 
<stdio.h>
sample::sample(
int v):m_value(v)
{
}

int sample::GetValue(){return m_value;}
void sample::SetValue(int v){m_value=v;}
sample::
~sample(void)
{
    fprintf(stderr,
"Delete sample address is %x\n",this);
}
测试 “main.cpp"
#include "sample.h"

namespace boost{namespace python{
BOOST_PYTHON_MODULE(pySample)
{
    class_
<sample>("sample")
        .def(
"get",&sample::GetValue)
        .def(
"set",&sample::SetValue)
    ;
    
    register_ptr_to_python
< pSample >();


}};


using namespace boost::python;
int _tmain(int argc, _TCHAR* argv[])
{
    Py_Initialize();
    initpySample();
    
    
try
    {
        
object main_module = import("__main__");
        
object main_namespace = main_module.attr("__dict__");
        pSample ptr(
new sample(25));
        
        main_namespace[
"sample"]=ptr;
        exec_file(
"sample.py",main_namespace,main_namespace);
        fprintf(stderr,
"print in c:%d %d\n",ptr->GetValue(),ptr.use_count());
    }
    
catch(error_already_set const &)
    {
        PyErr_Print();
    }

    fprintf(stderr,
"Before finalize\n");
    Py_Finalize();
    fprintf(stderr,
"After finalize\n");
    
return 0;
}
python 脚本 "sample.py"
print "print in python",sample.get()
print sample
sample.set(
12345)

posted on 2008-03-03 12:14 zarra 阅读(1357) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: