青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 79  文章 - 58  trackbacks - 0
<2010年10月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

常用鏈接

留言簿(9)

隨筆分類

隨筆檔案

文章檔案

相冊

搜索

  •  

積分與排名

  • 積分 - 296996
  • 排名 - 88

最新評論

閱讀排行榜

評論排行榜

pycxx是使用C++語言給python寫擴展代碼的輔助庫,他不像boost.python或者swig那樣封裝的很厚,

只是對python API的簡單封裝,將python的C API組織成類的形式。

首先來看pycxx自帶模塊擴展樣例:

class example_module : public ExtensionModule<example_module>

{

public:

    example_module()

    : ExtensionModule<example_module>( "example" )

    {

        add_varargs_method("sum", &example_module::ex_sum, 

"sum(arglist) = sum of arguments");

        add_varargs_method("test", &example_module::ex_test, 

"test(arglist) runs a test suite");

        initialize( "documentation for the example module" );

    }

    virtual ~example_module() {}

private:

    Object ex_sum(const Tuple &a) { ... }

    Object ex_test(const Tuple &a) { ... }

};

創(chuàng)建擴展模塊的步驟如下:

1、從 template<class T> ExtensionModule模板類繼承,class T 實例為本類

2、構(gòu)造函數(shù)傳入模塊名 ExtensionModule<example_module>( "example" )

3、實現(xiàn)擴展函數(shù),如實現(xiàn)了

   Object ex_sum(const Tuple &a) { ... }

4、在構(gòu)造函數(shù)中加入擴展函數(shù)

   add_varargs_method("sum", &example_module::ex_sum, 

"sum(arglist) = sum of arguments");

5、將擴展模塊注冊到python中

   initialize( "documentation for the example module" );

6、將模塊對象實例化,模塊屬于單一對象,給出的樣例是:

void initexample()

{

    static example_module* example = new example_module;

}

 

將擴展模塊注冊到python中靠這個initialize函數(shù)

void initialize( const char *module_doc="" )

{

    //調(diào)用了基類的方法

    ExtensionModuleBase::initialize( module_doc );

    //....

}

//最終也就是調(diào)用了python的API注冊進去了

void ExtensionModuleBase::initialize( const char *module_doc )

{

    PyObject *module_ptr = new ExtensionModuleBasePtr( this );

    Py_InitModule4

    (

    const_cast<char *>( m_module_name.c_str() ),    // name

    m_method_table.table(),                         // methods

    const_cast<char *>( module_doc ),               // docs

    module_ptr,                                     // pass to functions as "self"

    PYTHON_API_VERSION                              // API version

    );

}

 

可以看到注冊的時候傳入了m_method_table,是否這個加入擴展函數(shù)的地方呢, 這里雖然可以加入,但實際上add_varargs_method

是加入到method_map_t,相當(dāng)于該類的靜態(tài)成員中。

        static void add_varargs_method( const char *name, method_varargs_function_t function, const char *doc="" )

        {

            method_map_t &mm = methods();

            mm[ std::string( name ) ] = new MethodDefExt<T>( name, function, method_varargs_call_handler, doc );

        }

method_varargs_function_t是類的成員函數(shù)指針,原型如下,這也是pycxx用模板的主要原因了。

typedef Object (T::*method_varargs_function_t)( const Tuple &args );

 

在initialize函數(shù)里,遍歷了method_map_t,加入到模板的dict中。

        void initialize( const char *module_doc="" )
        {
            ExtensionModuleBase::initialize( module_doc );
            Dict dict( moduleDictionary() );

            //
            // put each of the methods into the modules dictionary
            // so that we get called back at the function in T.
            //
            method_map_t &mm = methods();
            EXPLICIT_TYPENAME method_map_t::const_iterator i = mm.begin();
            EXPLICIT_TYPENAME method_map_t::const_iterator i_end = mm.end();
            for ( ; i != i_end; ++i )
            {
                MethodDefExt<T> *method_def = (*i).second;

                static PyObject *self = PyCObject_FromVoidPtr( this, do_not_dealloc );

                Tuple args( 2 );
                args[0] = Object( self );
                args[1] = Object( PyCObject_FromVoidPtr( method_def, do_not_dealloc ) );

                PyObject *func = PyCFunction_New
                                    (
                                    &method_def->ext_meth_def,
                                    new_reference_to( args )
                                    );

                method_def->py_method = Object( func, true );

                dict[ (*i).first ] = method_def->py_method;
            }
        }

 

真正注冊到python中的函數(shù)其實是method_varargs_call_handler,即下面的method_def->ext_meth_def

                Tuple args( 2 );
                args[0] = Object( self );
                args[1] = Object( PyCObject_FromVoidPtr( method_def, do_not_dealloc ) );

                PyObject *func = PyCFunction_New
                                    (
                                    &method_def->ext_meth_def,
                                    new_reference_to( args )
                                    );

 

method_varargs_call_handler函數(shù)實現(xiàn)如下,第一個參數(shù)_self_and_name_tuple就是上面的args,

args[0]是this指針,args[1]保存著MethodDefExt,里面有成員指向所調(diào)用的函數(shù)

extern "C" PyObject *method_varargs_call_handler( PyObject *_self_and_name_tuple, PyObject *_args )
{
    try
    {
        Tuple self_and_name_tuple( _self_and_name_tuple );

        PyObject *self_in_cobject = self_and_name_tuple[0].ptr();
        void *self_as_void = PyCObject_AsVoidPtr( self_in_cobject );
        if( self_as_void == NULL )
            return NULL;

        ExtensionModuleBase *self = static_cast<ExtensionModuleBase *>( self_as_void );
        Tuple args( _args );

        Object result
                (
                self->invoke_method_varargs
                    (
                    PyCObject_AsVoidPtr( self_and_name_tuple[1].ptr() ),
                    args
                    )
                );

        return new_reference_to( result.ptr() );
    }
    catch( Exception & )
    {
        return 0;
    }
}

上述實現(xiàn)里又調(diào)用invoke_method_varargs,實現(xiàn)如下,這里ext_varargs_function就是真正調(diào)用的函數(shù)了,如注冊的ex_sum

        virtual Object invoke_method_varargs( void *method_def, const Tuple &args )
        {
            // cast up to the derived class, method_def and call
            T *self = static_cast<T *>( this );
            MethodDefExt<T> *meth_def = reinterpret_cast<MethodDefExt<T> *>( method_def );

            return (self->*meth_def->ext_varargs_function)( args );
        }

 

posted on 2012-03-01 20:59 merlinfang 閱讀(2953) 評論(2)  編輯 收藏 引用 所屬分類: pycxx

FeedBack:
# re: pycxx 源碼分析-- 創(chuàng)建python擴展模塊(1) 2012-03-01 23:48 dos命令大全
表示對py一竅不通  回復(fù)  更多評論
  
# re: pycxx 源碼分析-- 創(chuàng)建python擴展模塊(1) 2012-03-02 09:00 tb
分析得不錯  回復(fù)  更多評論
  

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              亚洲男女毛片无遮挡| 国产精品午夜在线观看| 亚洲视频免费在线观看| 亚洲伦伦在线| 一区二区三区www| 中日韩高清电影网| 亚洲一区bb| 久久av在线看| 欧美成黄导航| 欧美性大战xxxxx久久久| 国产精品一页| 亚洲欧洲精品一区二区三区不卡| 亚洲精品免费观看| 欧美在线免费| 91久久精品久久国产性色也91| 亚洲国产美女精品久久久久∴| 亚洲黄色性网站| 香蕉av777xxx色综合一区| 免费看成人av| 国产精品高清免费在线观看| 精品999在线播放| 国产精品99久久99久久久二8 | 午夜精品一区二区在线观看| 久久免费视频网站| 欧美性猛片xxxx免费看久爱| 激情六月婷婷综合| 亚洲欧美一区二区三区极速播放| 免费日韩视频| 性感少妇一区| 欧美性一区二区| 91久久久在线| 欧美专区一区二区三区| 亚洲精品久久久久久久久久久久| 午夜精品久久一牛影视| 欧美精品三级日韩久久| 黄色一区二区三区四区| 亚洲欧美视频在线| 在线亚洲一区二区| 亚洲综合日韩| 欧美精品成人| 亚洲黄色影片| 久久精品国产欧美亚洲人人爽| 亚洲第一页在线| 久久精品91久久久久久再现| 国产精品日本一区二区| 亚洲一级免费视频| 99国产精品久久久久久久成人热| 欧美韩国日本一区| 日韩网站免费观看| 亚洲激情第一页| 欧美福利电影网| 亚洲国产精品福利| 欧美成人自拍视频| 另类天堂av| 影音先锋日韩有码| 久久这里有精品15一区二区三区| 亚洲欧美区自拍先锋| 国产精品香蕉在线观看| 亚洲综合色在线| 一区二区三区国产在线观看| 欧美日韩www| 亚洲天堂成人| 亚洲尤物视频在线| 国产精品一页| 久久亚洲国产成人| 久色婷婷小香蕉久久| 亚洲国产色一区| 亚洲激情图片小说视频| 欧美久久久久中文字幕| 亚洲午夜久久久| 亚洲欧美日韩电影| 韩国福利一区| 欧美成人资源| 欧美剧在线观看| 亚洲私人影吧| 午夜日韩福利| 狠狠久久综合婷婷不卡| 欧美激情在线播放| 欧美性猛交一区二区三区精品| 欧美一区二区三区在线观看视频| 欧美一区二视频| 亚洲国产99| 99精品视频免费| 狠狠色狠狠色综合日日tαg| 亚洲国产精品第一区二区| 国产精品国产三级国产普通话三级 | 欧美成人综合网站| 亚洲免费影视第一页| 欧美在线啊v| 日韩视频在线观看国产| 亚洲欧美日韩国产综合| 亚洲国内自拍| 亚洲天堂成人在线观看| 欧美日韩大片| 99视频有精品| 亚洲视频免费在线观看| 国产麻豆午夜三级精品| 一本色道久久综合狠狠躁的推荐| 久久综合久久久久88| 欧美成黄导航| 国产精品高清一区二区三区| 亚洲一区二区久久| 性做久久久久久免费观看欧美| 国产精品成人一区二区网站软件| 一区二区三区国产盗摄| 亚洲欧美日本精品| 国产精品一区2区| 欧美一区亚洲二区| 裸体一区二区三区| 亚洲人久久久| 国产精品久久福利| 久久激情一区| 亚洲人成欧美中文字幕| 午夜精品福利一区二区三区av| 国产日韩在线播放| 开心色5月久久精品| 亚洲黄色性网站| 亚洲欧美中文日韩在线| 国产在线拍揄自揄视频不卡99| 久久久夜精品| 99日韩精品| 久久蜜桃精品| 亚洲人体1000| 国产精品免费观看在线| 久久久久国产成人精品亚洲午夜| 亚洲福利视频二区| 午夜激情久久久| 亚洲欧洲在线免费| 国产精品爽黄69| 欧美.www| 午夜国产精品视频| 亚洲高清自拍| 午夜天堂精品久久久久| 在线日韩欧美| 国产精品久久久久久一区二区三区| 久久精品免视看| 日韩一区二区免费看| 久久这里只有精品视频首页| 在线亚洲一区| 在线播放亚洲一区| 国产精品久久久久婷婷| 欧美电影资源| 久久九九久久九九| 在线亚洲精品福利网址导航| 亚洲高清毛片| 蜜臀91精品一区二区三区| 欧美影院一区| 午夜免费日韩视频| 日韩一区二区精品葵司在线| 国产一区二区三区久久久| 国产精品家教| 欧美日韩国产一区精品一区 | 国产亚洲欧美中文| 欧美日韩午夜视频在线观看| 久久综合给合| 欧美一区二区视频97| 这里只有精品视频| 亚洲精品一区二区三区在线观看| 美女主播视频一区| 久久久国产91| 久久er99精品| 欧美在线黄色| 欧美在线视频观看| 先锋影音久久久| 在线一区二区日韩| 亚洲卡通欧美制服中文| 亚洲电影第三页| 激情婷婷久久| 国产区在线观看成人精品| 国产精品成人观看视频国产奇米| 欧美精品97| 欧美精品一区二区三区一线天视频| 狂野欧美激情性xxxx欧美| 久久久久久久性| 久久人91精品久久久久久不卡| 久久动漫亚洲| 久久一区免费| 欧美大片免费观看在线观看网站推荐| 久久琪琪电影院| 免费在线观看成人av| 欧美福利一区| 欧美日韩视频在线观看一区二区三区| 欧美成人网在线| 欧美国产日韩免费| 欧美激情1区| 国产精品theporn| 国产乱码精品一区二区三区不卡 | 欧美亚洲自偷自偷| 久久不射中文字幕| 久久人人九九| 欧美成年人视频| 亚洲人成人一区二区三区| 中文亚洲免费| 久久久蜜桃精品| 欧美久久久久久| 国产日韩欧美自拍| 91久久线看在观草草青青| 一个色综合导航| 欧美一区二区三区在线视频 | 免费观看亚洲视频大全|