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

飯中淹的避難所~~~~~

偶爾來避難的地方~

  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
  94 隨筆 :: 0 文章 :: 257 評(píng)論 :: 0 Trackbacks
項(xiàng)目里需要使用腳本,我是框架的維護(hù)人員,就需要把腳本系統(tǒng)加入到框架里。
因?yàn)閷?duì)PYTHON比較熟悉,所以最后選擇了PYTHON作為腳本系統(tǒng)的主引擎。
下面是在這個(gè)過程中遇到的種種問題以及最后的解決方法。

1- 編譯出錯(cuò),提示找不到 __imp_Py_XXXX的引用
   這個(gè)問題真的很惡心,WIN版的PYTHON27.DLL用的是單線DLL的CRT,而項(xiàng)目如果用的是多線LIB的CRT,或者其他不兼容的CRT,就會(huì)出這個(gè)問題。
   果斷下載PYTHON2.7.2的源代碼,編譯之。然而,編譯過程也非常的惡心,工程屬性修改成MTd和MT仍舊不行。
   后看到編譯時(shí)有調(diào)用cl的命令行,找了半天在make_buildinfo這個(gè)項(xiàng)目里發(fā)現(xiàn)是使用代碼生成的編譯參數(shù),里面寫死的是MDd,修改之再編譯,問題解決。

2- Py_Initialize 退出,提示無法找到site模塊。
    這個(gè)問題原本想暴力的修改源代碼里的nosite標(biāo)記改之,后思考可能這個(gè)模塊是有用的,所以把運(yùn)行過PYTHON.EXE的PYTHON運(yùn)行路徑里的LIB里的被編譯成PYC的所有PY按路徑復(fù)制到EXE的路徑下,問題解決。

3- 不想用BOOST.PYTHON,又想不用寫PyCFunction的形式的C模塊方法
    這個(gè)問題經(jīng)過分析,得到結(jié)論是,從任意形式的用戶函數(shù)生成一個(gè)PyObject*(*PYFUNC)(PyObject*,PyObject*)形式的函數(shù)封裝。并且對(duì)于一個(gè)獨(dú)立地址的用戶函數(shù),需要一個(gè)獨(dú)立地址的函數(shù)封裝。
    首先,我開始解決如何從一個(gè)固定函數(shù)得到另一個(gè)固定地址函數(shù)。一開始我想到用函數(shù)地址作為模版參數(shù),這樣每個(gè)獨(dú)立地址就能生成一個(gè)單獨(dú)的模版類,然后模版類里的靜態(tài)函數(shù)自然就是獨(dú)立地址的。后我使用了static的本地函數(shù)測(cè)試,未果,提示什么non-extra的錯(cuò)誤。后進(jìn)群詢問,得到同樣答案,并且編譯成功的結(jié)果。仔細(xì)觀察后發(fā)現(xiàn),他用的是非static修飾的函數(shù)。我去掉static修飾,竟然成了。
    接下來,我開始解決如何從PyObject*args解析出用戶函數(shù)的每個(gè)參數(shù)的問題。這個(gè)問題有幾個(gè)部分,第一部分是如何從函數(shù)里析出每個(gè)參數(shù),這部分我用了模版的某種特化,具體名字我不懂,就是如下面這種形式:
   
template <typename TR, typename T1 = void, typename T2 = void>
struct st_func {};
template 
<typename TR, typename T1>
struct st_func<TR, T1, void> {};

    這樣就可以析出返回值TR和各個(gè)參數(shù)的類型。為了支持盡可能多的參數(shù),我寫了個(gè)程序生成了從0個(gè)參數(shù)到40個(gè)參數(shù)的模版變體。
    使用固定地址,因?yàn)楹瘮?shù)定義需要TR,T1,所以函數(shù)指針無法直接在第一個(gè)模版參數(shù)傳遞,并且是固定參數(shù),無法放在可選參數(shù)后面,所以我選擇了先在第一個(gè)參數(shù)用void*傳遞函數(shù)指針,然后在st_func內(nèi)部用TR,T1...這些拼出一個(gè)函數(shù)指針,把首位置的指針強(qiáng)轉(zhuǎn)成原函數(shù)形式,再進(jìn)行調(diào)用。
    因?yàn)镻YTHON的解析函數(shù)需要每個(gè)參數(shù)的類型標(biāo)識(shí)符,大部分類型是一個(gè)字符表示,這部分用了enum來為每個(gè)類型生成一個(gè)const且static的字符標(biāo)識(shí)。比如
template <> struct type_char<int> { enum{ typechar = 'i' };};
    然后最終PyArg_ParseTuple 需要的是一個(gè)字符串,那么我在代碼里就 這樣來生成這個(gè)字符串:
   
char szTypes[] = { type_char<T1>::typechar, .., 0 };
    最后一個(gè)部分是解決TR是void時(shí)的函數(shù)返回值問題。后來我用了struct內(nèi)部的特化函數(shù)來解決。最終形式如下:


template <void* FP, typename TR, typename T1>
struct st_cppfunc_to_py<FP, TR, T1, void, void>
{
typedef TR (
*TFP)(T1);
static PyObject * func( PyObject * self, PyObject * args ) { return _func<TR>( self, args ); }
template
<typename ITR>
static PyObject * _func( PyObject * self, PyObject * args ) {
char szType[] = { type_char<T1>::typechar, 0 };
T1 v1;
if( PyArg_ParseTuple( args, szType, &v1 ) ) {
TR ret
= ((TFP)FP)( v1 );
char szRetType[2] = { type_char<TR>::typechar, 0 };
return Py_BuildValue( szRetType, ret );
}
Py_RETURN_NONE;
}
template
<>
static PyObject * _func<void>( PyObject * self, PyObject * args ) {
char szType[] = { type_char<T1>::typechar, 0 };
T1 v1;
if( PyArg_ParseTuple( args, szType, &v1 ) ) {
((TFP)FP)( v1 );
}
Py_RETURN_NONE;
}

};

外面包一個(gè)  template <void*FP, typename TR, typename T1> PyCFunction __cppfunc2py( TR(*RFP)(T1) ) { return st_cppfunc_to_py<FP, TR, T1>::func; }

就可以很方便的生成嵌入PY的函數(shù)了。

4- 包裝的scriptvalue怎么獲得PyObject*的類型呢
    用Py_TYPE(ob)就可以獲取到object的typeobject,它的tp_name就是它的名字,常用類型 int, long, float, str 都可以分辨出來。

5- PYTHON的調(diào)試版總是報(bào)GC異常
    這個(gè)問題我是嘗試著來解決的,總結(jié)了以下幾點(diǎn):
    a. 模塊的DICT是不用PY_XDECREF來釋放的   
    b. 返回值需要一個(gè)PY_XDECREF釋放。
    c. Py_BuildValue 返回值需要一個(gè)PY_XDECREF。
    d. 用戶模塊不需要 PY_XDECREF。
    e. PY文件生成的模塊需要一個(gè) PY_XDECREF。
    f. Set Object到Tuple去調(diào)完P(guān)Y的函數(shù),PY_XDECREF(TUPLE)時(shí),需要注意的是,Set進(jìn)去的Object都會(huì)被調(diào)用一次Py_XDECREF,所以一個(gè)好的辦法是在Set進(jìn)Tuple時(shí),就INC一下他們的REF。
6- 為何一直調(diào)不到py文件里的函數(shù)
    這個(gè)問題困擾了我?guī)追昼姡K的method獲取不到,讓我一度以為是腳本寫的問題。
    后來我打印出來腳本的搜索路徑(print sys.path),是一大堆的路徑,我放進(jìn)去的路徑排在最后。于是我想,是不是有的路徑下有重名的PY文件,就給文件改了個(gè)名字,結(jié)果就OK了。
    這個(gè)問題,我后來想可以通過調(diào)整搜索優(yōu)先級(jí)來解決,不過目前還是這樣解決比較好,因?yàn)檎{(diào)整方法目前還不得而知。

   
posted on 2012-02-10 21:55 飯中淹 閱讀(3277) 評(píng)論(0)  編輯 收藏 引用

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(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>
            国产一区二区三区四区hd| 国产精品扒开腿爽爽爽视频 | 欧美成人第一页| 国产欧美亚洲一区| 欧美在线关看| 亚洲韩国精品一区| 亚洲欧美国产高清va在线播| 性欧美在线看片a免费观看| 国产精品日韩| 蜜臀a∨国产成人精品| 日韩亚洲欧美在线观看| 午夜宅男欧美| 久久精品色图| 一区二区三区不卡视频在线观看 | 亚洲欧洲日产国码二区| 欧美日韩久久不卡| 久久国产88| 亚洲免费高清| 黑丝一区二区| 国产精品jizz在线观看美国| 国产精品毛片a∨一区二区三区| 免费看黄裸体一级大秀欧美| 亚洲午夜在线观看| 亚洲激情视频在线观看| 久久高清一区| 亚洲福利在线视频| 欧美在线视频日韩| 免费久久99精品国产| 欧美亚洲视频在线观看| 久久性色av| 久久久久久久久久看片| 亚洲欧美三级在线| 亚洲线精品一区二区三区八戒| 亚洲一区二区三区四区中文| 亚洲国产精品电影| 国产精品日韩在线| 在线观看欧美日韩国产| 国产精品美女xx| 亚洲国产91色在线| 欧美伊人久久| 午夜视频一区二区| 欧美国产激情| 欧美国产日韩精品免费观看| 午夜日韩视频| 亚洲高清在线精品| 欧美中文在线观看国产| 欧美日韩综合久久| 国产精品久久久久久久久婷婷| 伊人成人在线| 久久成人这里只有精品| 99精品欧美一区二区三区| 91久久亚洲| 欧美在线视频一区二区三区| 国产精品久久福利| 国产精品久久午夜夜伦鲁鲁| 亚洲精品日韩综合观看成人91| 亚洲电影观看| 日韩一级裸体免费视频| 99视频+国产日韩欧美| 一本色道久久综合| 欧美mv日韩mv国产网站| 欧美综合国产精品久久丁香| 国产精品影音先锋| 在线观看91久久久久久| 久久se精品一区精品二区| 一区二区三区偷拍| 欧美一区在线视频| 国产精品午夜春色av| 亚洲一区二区三区777| 一区二区高清视频| 久久久久久久综合| 欧美激情免费在线| 欧美日韩国内| 一本色道久久综合亚洲精品不| 欧美国产第二页| 欧美另类综合| 国产麻豆视频精品| 久久久久国产精品一区| 久久精品国产第一区二区三区| 欧美久久99| 中文精品视频一区二区在线观看| 久久国产精品第一页| 欧美一级二区| 欧美日韩国产色视频| 在线亚洲成人| 午夜精品福利在线观看| 蜜桃久久精品一区二区| 99re6这里只有精品视频在线观看| 亚洲精品一级| 猫咪成人在线观看| 在线一区二区视频| 久久中文字幕一区| 亚洲免费在线观看| 国产精品专区一| 久久久久久久久久久久久久一区| 久久久久久综合网天天| 日韩午夜av电影| 亚洲欧美电影在线观看| 在线播放中文字幕一区| 91久久精品一区二区三区| 国产精品草草| 久久中文欧美| 欧美色区777第一页| 久久久久久婷| 午夜精品在线看| 国产精品网站在线播放| 免费欧美日韩| 国产精品一页| 亚洲精品乱码久久久久久久久 | 久久国产乱子精品免费女| 亚洲国产一区二区三区a毛片| 久久午夜视频| 国产精品va在线播放我和闺蜜| 久久久国产精品一区二区三区| 欧美激情1区2区3区| 亚洲激情在线激情| 亚洲一区二区三区在线| 国产精品每日更新| 亚洲福利专区| 精久久久久久久久久久| 久久综合99re88久久爱| 国产精品vvv| 亚洲精品久久久久久久久久久久久 | 亚洲国产婷婷综合在线精品| 中文在线一区| 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 亚洲美女一区| 亚洲精品五月天| 蜜臀av在线播放一区二区三区 | 久久精品国产久精国产一老狼| 欧美午夜三级| 99pao成人国产永久免费视频| 91久久在线| 免费成人av| 亚洲电影在线播放| 精品成人国产| 美女精品国产| 亚洲欧美日韩一区二区在线 | 亚洲大片av| 国模套图日韩精品一区二区| 午夜日韩av| 欧美无砖砖区免费| 中国成人在线视频| 亚洲一区中文| 久久婷婷久久一区二区三区| 亚洲第一搞黄网站| 久久精品欧美| 一区二区精品| 欧美日韩a区| 亚洲精品一区二区三区99| 一区二区三区四区国产精品| 欧美吻胸吃奶大尺度电影| 一区二区电影免费在线观看| 亚洲字幕在线观看| 国产精品亚洲精品| 欧美在线|欧美| 欧美激情精品久久久久久变态| 亚洲高清免费在线| 欧美激情va永久在线播放| 亚洲韩国青草视频| 亚洲一区二区三区中文字幕 | 国产精品日本精品| 亚洲免费中文字幕| 久久亚洲精品一区| 亚洲美女精品久久| 国产精品成人一区二区三区夜夜夜| aⅴ色国产欧美| 久久精品在线观看| 日韩一区二区精品| 欧美午夜免费影院| 久久国产一区二区| 日韩网站在线看片你懂的| 欧美一级黄色网| 亚洲国产清纯| 国产美女精品视频| 欧美高清自拍一区| 亚洲欧美日韩区| 亚洲第一福利在线观看| 午夜日韩在线观看| 亚洲欧洲视频在线| 国产亚洲精品aa| 欧美精品播放| 久久狠狠一本精品综合网| 亚洲日本成人| 久久久人成影片一区二区三区| 日韩午夜中文字幕| 在线观看91精品国产入口| 国产精品区一区二区三区| 久久一二三区| 欧美一级夜夜爽| av成人福利| 亚洲国产综合视频在线观看| 久久久噜噜噜久久久| 99视频精品全部免费在线| 亚洲丶国产丶欧美一区二区三区| 国产精品日本精品| 欧美日韩在线播放一区| 免费短视频成人日韩| 久久久久久久999精品视频| 亚洲在线视频观看|