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

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

偶爾來避難的地方~

  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>
            亚洲小说区图片区| 亚洲国产精品成人综合| 亚洲天堂男人| 国产精品腿扒开做爽爽爽挤奶网站| 亚洲图片欧美日产| 亚洲欧美大片| 亚洲大胆女人| 亚洲精品无人区| 麻豆91精品| 亚洲日本中文| 国产精品私房写真福利视频| 亚洲欧美变态国产另类| 亚洲免费网站| 国产在线精品一区二区中文| 欧美成人免费在线| 国产精品狠色婷| 久久九九免费视频| 欧美成人精品高清在线播放| 亚洲色图在线视频| 欧美一区2区三区4区公司二百| 亚洲高清在线视频| 亚洲午夜久久久| 在线激情影院一区| 一本大道av伊人久久综合| 国产欧美日韩在线| 亚洲第一视频| 国产九九精品视频| 亚洲大胆女人| 国产精品久久久久久久久久久久久| 欧美在线视频全部完| 麻豆成人在线| 午夜视频一区在线观看| 久久亚洲国产精品日日av夜夜| 夜夜精品视频| 免费日韩视频| 久久午夜国产精品| 国产精品v片在线观看不卡| 久久亚洲精品伦理| 国产精品视频网址| 亚洲毛片视频| 亚洲国产精品电影| 久久久之久亚州精品露出| 性欧美大战久久久久久久免费观看| 美脚丝袜一区二区三区在线观看| 欧美一区二区三区免费观看| 欧美日韩性生活视频| 欧美国产一区视频在线观看| 国产一区二区在线观看免费| 亚洲视频网站在线观看| 亚洲深夜激情| 99这里只有精品| 欧美电影在线免费观看网站| 噜噜噜噜噜久久久久久91| 国产亚洲一区二区在线观看 | 亚洲欧美日韩天堂一区二区| 欧美成人精品一区| 欧美国产先锋| 亚洲经典三级| 久久伊人一区二区| 女女同性女同一区二区三区91| 国产曰批免费观看久久久| 欧美一级在线亚洲天堂| 久久精品亚洲一区| 国产自产v一区二区三区c| 欧美一级黄色网| 久久久久久一区二区| 国产在线不卡| 榴莲视频成人在线观看| 亚洲第一主播视频| 日韩一级黄色av| 久久综合九色综合久99| 一本久久综合| 久久久99爱| 黄色一区二区在线观看| 久久久久久久综合| 欧美电影在线| 在线亚洲精品福利网址导航| 欧美日韩一区二区免费在线观看| aa级大片欧美| 欧美在线一二三四区| 一色屋精品亚洲香蕉网站| 美女亚洲精品| 亚洲线精品一区二区三区八戒| 欧美在线日韩| 亚洲国产日韩欧美在线99 | 欧美一级一区| 男男成人高潮片免费网站| 99视频+国产日韩欧美| 欧美性色综合| 久久久中精品2020中文| 亚洲精品裸体| 久久精品亚洲| 99成人精品| 国内激情久久| 欧美日韩免费视频| 欧美中文字幕久久| 亚洲精品一区二区三区av| 欧美在线看片| 中日韩美女免费视频网址在线观看 | 欧美顶级少妇做爰| 亚洲综合日韩中文字幕v在线| 看片网站欧美日韩| 亚洲午夜在线观看| 在线欧美日韩精品| 国产精品v亚洲精品v日韩精品| 久久精品国产亚洲一区二区三区| 91久久精品国产91性色| 久久久综合网| 欧美一区二粉嫩精品国产一线天| 亚洲电影免费| 国产亚洲激情视频在线| 欧美日韩一区二区视频在线| 久久久久久9999| 午夜精品福利视频| 99re视频这里只有精品| 欧美成人免费大片| 久久久久国内| 校园春色综合网| 亚洲视频每日更新| 最新国产の精品合集bt伙计| 国产日韩精品在线| 国产精品欧美在线| 欧美视频一区二区三区在线观看| 猛男gaygay欧美视频| 久久福利电影| 午夜一级在线看亚洲| 中文无字幕一区二区三区| 亚洲欧洲一二三| 欧美成人高清| 免费观看成人| 免费在线亚洲欧美| 久久综合中文字幕| 久久香蕉国产线看观看网| 久久精品盗摄| 久久精品欧美日韩精品| 午夜免费日韩视频| 亚洲欧美制服另类日韩| 亚洲一区免费看| 亚洲一区在线免费| 亚洲综合首页| 欧美成人精品一区二区| 久久综合九色| 美日韩丰满少妇在线观看| 久久精品视频播放| 久久人人看视频| 久久婷婷亚洲| 美女国产精品| 欧美激情第10页| 欧美另类视频| 国产精品ⅴa在线观看h| 欧美性久久久| 国产日韩欧美精品一区| 狠狠狠色丁香婷婷综合激情| 尤物九九久久国产精品的特点 | 欧美精品性视频| 欧美日韩亚洲视频一区| 国产精品r级在线| 国产日韩欧美在线播放| 黄色综合网站| 99一区二区| 欧美一区2区视频在线观看| 久久久亚洲人| 亚洲欧洲在线免费| 亚洲天堂免费在线观看视频| 欧美在线免费| 欧美精品麻豆| 国产日产亚洲精品| 亚洲国产精品欧美一二99| 一区二区久久| 久久久久久久一区二区| 亚洲国产日韩一区| 亚洲免费影视第一页| 久久夜色精品国产亚洲aⅴ| 欧美日本久久| 国产一区二区三区自拍| 亚洲精品一区二区在线| 午夜在线成人av| 亚洲风情亚aⅴ在线发布| 亚洲天堂av在线免费| 牛夜精品久久久久久久99黑人| 欧美日韩午夜剧场| 在线精品视频一区二区三四| 中文一区在线| 蜜臀99久久精品久久久久久软件 | 欧美激情精品| 亚洲先锋成人| 欧美紧缚bdsm在线视频| 国产亚洲欧美色| 亚洲一区二区三区国产| 欧美福利视频网站| 香蕉久久一区二区不卡无毒影院| 欧美福利视频在线观看| 韩国av一区二区三区| 亚洲欧美日韩国产中文| 亚洲精品免费观看| 另类欧美日韩国产在线| 国产亚洲欧美色| 午夜日韩av| 一本色道久久88精品综合| 欧美www视频|