swig 實(shí)踐(python & c/c++)(一)

前言

隨便寫點(diǎn)迅涮,不保持更新账蓉,構(gòu)想是先簡單說些實(shí)踐的東西(這里就是python和c/c++)歪脏,當(dāng)然也可以支持R,C#,D,Go..這些舟扎,后面具體說一下swig這個東西(當(dāng)然如果保持更新的話)遥巴。

當(dāng)然我們又不能不先膚淺的談一下swig千康,最直接的認(rèn)識就是先上一個圖,
swig.JPG

它可以用來連接(包裝)其它的語言铲掐,以便發(fā)揮它們各自的特性拾弃。其實(shí)大多數(shù)情況下知道這個就已經(jīng)夠了,然后會簡單使用一下就可以摆霉,那些大的框架里面用的比較多豪椿,譬如時下流行的神經(jīng)網(wǎng)絡(luò)框架Tensorflow,Caffe這些,在溝通后端和前端的語言時携栋,就會大量用到搭盾。

開始

然后就從簡單的事例講起,先說安裝婉支,手邊在用windows鸯隅,就用這個說明就好了,畢竟對于經(jīng)常用Linux的向挖,基本上git蝌以,文檔一看就懂的。
win的話從這里下載:http://prdownloads.sourceforge.net/swig/swigwin-3.0.12.zip
然后在環(huán)境變量配置一下何之,終端swig測試一下就知道可以沒有跟畅。同時保持有python和C/C++的環(huán)境。

現(xiàn)在就可以正式開始了溶推,我們假定構(gòu)造一個環(huán)境:有一個簡單c/c++的文件(一般就是寫點(diǎn)效率代碼徊件,算法底層這種的),然后嘗試著用python調(diào)用悼潭。
過程是這樣的:

1.搞一個c/c++代碼:

/*File:test.c*/
void quick_sort(int s[], int l, int r)
{
    if (l < r)
    {
        int i = l, j = r, x = s[l];
        while (i < j)
        {
            while (i < j && s[j] >= x)//從右到左找到第一個小于x的數(shù)  
                j--;
            if (i < j)
                s[i++] = s[j];

            while (i < j && s[i] <= x)//從左往右找到第一個大于x的數(shù)  
                i++;
            if (i < j)
                s[j--] = s[i];

        }

        s[i] = x;//i = j的時候庇忌,將x填入中間位置  
        quick_sort(s, l, i - 1);//遞歸調(diào)用 
        quick_sort(s, i + 1, r);
    }
}
/*File:test.h*/
void quick_sort(int s[], int l, int r);

隨便寫一個快排的代碼,2.然后構(gòu)造一個swig module舰褪。

/* File:test.i*/
%module test

%{
#define SWIG_FILE_WITH_INIT
#include "test.h"
%}

void quick_sort(int s[], int l, int r);

3.終端輸入(當(dāng)前目錄下皆疹,否則添加完整路徑)
(C的情況下):

swig -python test.i

(C++的情況下)

swig -c++ -python test.i

會生成兩個文件:test_wrap.c(c)或者test_wrap.cxx(c++)和test.py。當(dāng)然這個.py是不可以直接使用的占拍,還缺點(diǎn)東西略就。
我們把這里的c/c++文件叫做low-level,生成的py叫做high-level,對于c/c++的生成文件需要進(jìn)行編譯并鏈接其余的部分(文件中所引用的東西)創(chuàng)建一個擴(kuò)展module,對于py文件晃酒,就是要導(dǎo)入的文件表牢。

說下名字的問題。比如我們用的module:test.i就會默認(rèn)生成一個加了_wrap的包裝器test_wrap.c贝次。如果要更改的話崔兴,可以使用swig的可選項-o指定。生成的py文件就是同名的.py文件。

4.然后我們繼續(xù)后面的話題敲茄,如何使用它們位谋。
先說一種方法:使用python的distutils庫,這個東西玩自動化運(yùn)維的人一定不陌生堰燎,當(dāng)然也不準(zhǔn)備詳細(xì)說明掏父,就是簡單說一下。

from distutils.core import setup, Extension

test_module = Extension('_test',
sources=['test_wrap.c', 'test.c'],
)

setup (name = 'test',
version = '0.1',
author = "孟哲凡",
description = """swig demo""",
ext_modules = [test_module],
py_modules = ["test"],
)

從上面我們可以看到在test_module里的sources是目前已經(jīng)有的秆剪,我們需要生成一個_test,然后放到setup函數(shù)里面赊淑,當(dāng)然里面還可以放一些其他的東西,可以去看一下仅讽。它一般習(xí)慣就叫setup.py陶缺。

5.然后就可以了,終端執(zhí)行

python setup.py build_ext --inplace

一般情況下會報錯何什,說是缺少一個vcvarsall.bat的文件组哩,這個東西是因為python的解釋器底層是用了大量的c語言的,distutils也會用处渣,它找不到伶贰,這是個VC里的東西,在python的lib里的_msvccompiler.py里面有說明版本位置這些罐栈。一種做法是按照這里的代碼把VC裝成指定版本黍衙,版本的計算方法是在終端輸入python會提示 [MSC v.1900 64 bit (AMD64)]這種東西,這個1900就是版本號荠诬,前兩個字節(jié) - 6,后兩個字節(jié)/10.0求和就是琅翻。所以1900就是13「陶辏可以下載vs2013就好了方椎。但是通常情況下我們懶得這么做,因為很多情況下都是裝過vs的钧嘶,即便只裝vc也麻煩棠众,最簡單的辦法就是把_msvccompiler.py里的位置替換成你已有vs里的vcvarsall.bat目錄位置。詳細(xì)的做法百度里會有有决。簡單說明一下闸拿。

當(dāng)上面這個沒有的問題的時候,我們正式開始书幕,執(zhí)行完會生成一個.pyd的文件新荤,.pyd就是一個python引用其它語言的后綴,所以有了這個台汇,之前生成.py文件才有完整的依賴苛骨,可以正式使用篱瞎。

6.大概介紹到這里的時候,這篇文章就應(yīng)該完了智袭。但是細(xì)心的人會發(fā)現(xiàn)奔缠,好像不知道怎么用這個東西,因為我們的例子找的有點(diǎn)隨意吼野,里面有個數(shù)組,這個東西看似司空見慣两波。但是突然要用python做輸入瞳步,有點(diǎn)暈,當(dāng)我們用list或者tuple輸入的時候都會報錯腰奋,說是要求一個int []類型的參數(shù)单起,python里面哪有這種東西。但細(xì)心一想還是容易懂的劣坊,數(shù)組是什么嘀倒,數(shù)組是指針的簡單形式,也可以說c語言可以沒有數(shù)組(圖個方便)局冰,只有指針就夠了测蘑。在swig的處理中,把python的函數(shù)和C的指針劃分成一類康二。

我們剛才談到了函數(shù)碳胳,所以嘗試在python里面搞個函數(shù),然后扔到里面沫勿,發(fā)現(xiàn)現(xiàn)在不會報類型錯誤了挨约,但是會異常退出,因為我們不知道在函數(shù)里面返回點(diǎn)什么产雹,他會認(rèn)識诫惭。所以換個想法,如果我C里面有個函數(shù)可以用python調(diào)用蔓挖,那C里面放什么我們該知道吧夕土。搞塊內(nèi)存用就可以了,然后順著再搞個賦值函數(shù)就可以了时甚。所以開始去改一下module,加一個內(nèi)聯(lián)塊:

%inline %{

int* array(int l) {
    return (int *)malloc(l * sizeof(int));
}

void array_set(int s[], int i, int v) {
    s[i] = v;
}

void print_array(int s[]) {
    for(int i = 0; i < 6; i++) {
        printf("%d\t",s[i]);
    }
}
%}

當(dāng)然還要加一個free的函數(shù)隘弊,就不掛在上面了,這樣當(dāng)我們重新的在python里用一下發(fā)現(xiàn)就可以了荒适,得到了正確的輸出梨熙。

0   1   3   4   5   12  
Process finished with exit code 0

這部分就完了,后面說另一個辦法:Linux里面用gcc編譯刀诬,win下用vs里的功能生成鏈接庫的辦法咽扇。然后解釋一下在這個過程中可能出現(xiàn)的一些錯誤邪财。當(dāng)這個都說完以后,就可以正經(jīng)開始這個話題了质欲。這些只是預(yù)熱树埠。因為c++有那么復(fù)雜的語法要用python去調(diào)用,要有很多的細(xì)節(jié)和方法嘶伟。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末怎憋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子九昧,更是在濱河造成了極大的恐慌绊袋,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铸鹰,死亡現(xiàn)場離奇詭異癌别,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蹋笼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進(jìn)店門展姐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人剖毯,你說我怎么就攤上這事圾笨。” “怎么了速兔?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵墅拭,是天一觀的道長。 經(jīng)常有香客問我涣狗,道長谍婉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任镀钓,我火速辦了婚禮穗熬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘丁溅。我一直安慰自己唤蔗,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布窟赏。 她就那樣靜靜地躺著妓柜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪涯穷。 梳的紋絲不亂的頭發(fā)上棍掐,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天,我揣著相機(jī)與錄音拷况,去河邊找鬼作煌。 笑死掘殴,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的粟誓。 我是一名探鬼主播奏寨,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鹰服!你這毒婦竟也來了病瞳?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤获诈,失蹤者是張志新(化名)和其女友劉穎仍源,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舔涎,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年逗爹,在試婚紗的時候發(fā)現(xiàn)自己被綠了亡嫌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡掘而,死狀恐怖挟冠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情袍睡,我是刑警寧澤知染,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站斑胜,受9級特大地震影響控淡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜止潘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一掺炭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧凭戴,春花似錦涧狮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至档痪,卻和暖如春涉枫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钞它。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工拜银, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留殊鞭,地道東北人。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓尼桶,卻偏偏與公主長得像操灿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子泵督,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評論 2 361