混合編程:用 C 語(yǔ)言來(lái)擴(kuò)展 Python 大法吧根欧!

Python 實(shí)在是一種讓人上癮的編程語(yǔ)言羽杰,簡(jiǎn)潔的語(yǔ)法+豐富的擴(kuò)展包屎慢,幾乎可以用 Python 做任何事情瞭稼,唯一的黑點(diǎn)似乎就是「慢」忽洛,但是與高效的編譯語(yǔ)言 C\C++ 互聯(lián)以后腻惠,可以解決腳本語(yǔ)言運(yùn)行速度慢的問(wèn)題,甚至用來(lái)做一些計(jì)算密集型的工作欲虚,比如 CFD集灌。
這一篇介紹純 C 語(yǔ)言擴(kuò)展 Python。

為什么是swig复哆?

Python底層就是 C\C++欣喧,有原生的 C\C++ 接口,用來(lái)傳遞變量梯找,但是完全手寫中間層對(duì)于我這樣的業(yè)余 Coder 實(shí)在太痛苦了唆阿,這不是一件很有意思的工作。事實(shí)上锈锤,即使在Python的官方文檔里也推薦用第三方的接口工具處理驯鳖。

Third party tools like Cython, cffi, SWIG and Numba offer both simpler and more sophisticated approaches to creating C and C++ extensions for Python.

除了以上的第三方工具外,還有 sip,Boost.python,pyrex等好用的工具久免,在這篇 文章 里初步介紹了 C\C++ 擴(kuò)展Python的各種方法浅辙。
之前用過(guò)Boost.python,可能是我之前沒(méi)接觸過(guò)Boost吧阎姥,不是很喜歡记舆,感覺(jué)不夠輕量級(jí),然后對(duì)swig一見(jiàn)傾心的原因是其對(duì)于純 C 的良好支持(當(dāng)時(shí)寫這篇文章的時(shí)候?qū)?C++ 莫名的反感呼巴,雖然現(xiàn)在已經(jīng)入了 C++ 的坑了)泽腮。

怎么安裝swig?

1.Mac OS
強(qiáng)烈建議用brew來(lái)裝

brew install swig

一條命令搞定衣赶,媽媽再也不用擔(dān)心你的依賴問(wèn)題了诊赊。

2.Windows
博主暫時(shí)脫離windows開(kāi)發(fā)環(huán)境一會(huì)兒,建議參考官方文檔

3.Linux
大名鼎鼎的apt-get install

怎么使用swig屑埋?

我參考了官方文檔里的一個(gè)示例程序豪筝,最終的目的是生成一個(gè)動(dòng)態(tài)鏈接庫(kù)和一個(gè)供調(diào)用的py文件。

  • 聲明函數(shù)先
    創(chuàng)建一個(gè)example.h頭文件來(lái)聲明這個(gè)函數(shù):
/*File: example.h*/
int fact(int n);
  • 定義函數(shù)
    創(chuàng)建一個(gè)example.c的文件(用來(lái)計(jì)算 n!):
/* File: example.c */
#include "example.h"
int fact(int n) {
    if (n < 0){
   /* This should probably return an error, but this is simpler */
        return 0; }
    else  if (n == 0) {
            return 1;
                    }
    else {
            /* testing for overflow would be a good idea here */
            return n * fact(n-1);
          }
 }
  • 關(guān)鍵一步
    我們還需要?jiǎng)?chuàng)建一個(gè)example.i文件來(lái)配置swig
/* File: example.i */
%module example

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

int fact(int n);

簡(jiǎn)單解釋一下這個(gè)配置文件摘能,#define SWIG_FILE_WITH_INIT宏規(guī)定這個(gè) C 文件將會(huì)被編譯成 Python 模塊续崖,#include "example.h" 給出需要包含的頭文件,最后一句在example.i聲明了這個(gè)函數(shù)团搞,就是這么簡(jiǎn)單嘛严望。
有了這三個(gè)文件之后,我們需要先編譯出一個(gè) Python 文件逻恐,在終端運(yùn)行:

swig -python example.i

如果編譯的是C++文件像吻,需要加上-C++選項(xiàng):

swig -c++ -python example.i

運(yùn)行完這個(gè)命令后峻黍,在工作目錄里會(huì)出現(xiàn)example_wrap.cexample.cxx以及一個(gè)example.py的Python文件,但是現(xiàn)在這個(gè)模塊還不能直接調(diào)用拨匆,因?yàn)檫€缺少動(dòng)態(tài)鏈接庫(kù)姆涩,如果強(qiáng)行調(diào)用會(huì)出現(xiàn)這種錯(cuò)誤:

ImportError: No module named '_example'

接下來(lái)需要編譯出一個(gè)shared object file,在Linux平臺(tái)里是so文件惭每,在windows下是Dll文件骨饿,有兩種方法完成這個(gè)步驟,官方文檔中推薦使用distutils台腥,即Python的setup.py生成模塊:

"""
    setup.py file for SWIG example
"""
from distutils.core import setup, Extension

example_module = Extension('_example',
                               sources=['example_wrap.c', 'example.c'],
                               )
setup(name = 'example',
    version = '0.1',
    author = "SWIG Docs",
    description = """Simple swig example from docs""",
    ext_modules = [example_module],
    py_modules = ["example"],
    )

然后在終端里輸入:

python setup.py build_ext --inplace

build_ext告訴Python需要編譯的是擴(kuò)展模塊宏赘,--inplace會(huì)確保編譯生成的文件放在當(dāng)前目錄中。
運(yùn)行完這個(gè)命令后黎侈,會(huì)在工作目錄出現(xiàn)一個(gè)so文件察署,這時(shí)example.py文件可以直接被Python調(diào)用:

10! = 362880

來(lái)自 Cescfangs 的博客:fangs.in

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市峻汉,隨后出現(xiàn)的幾起案子贴汪,更是在濱河造成了極大的恐慌,老刑警劉巖俱济,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嘶是,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蛛碌,警方通過(guò)查閱死者的電腦和手機(jī)聂喇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蔚携,“玉大人希太,你說(shuō)我怎么就攤上這事≡脱眩” “怎么了誊辉?”我有些...
    開(kāi)封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)亡脑。 經(jīng)常有香客問(wèn)我堕澄,道長(zhǎng),這世上最難降的妖魔是什么霉咨? 我笑而不...
    開(kāi)封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任蛙紫,我火速辦了婚禮,結(jié)果婚禮上途戒,老公的妹妹穿的比我還像新娘坑傅。我一直安慰自己,他們只是感情好喷斋,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布唁毒。 她就那樣靜靜地躺著蒜茴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪浆西。 梳的紋絲不亂的頭發(fā)上粉私,一...
    開(kāi)封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音室谚,去河邊找鬼毡鉴。 笑死,一個(gè)胖子當(dāng)著我的面吹牛秒赤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播憎瘸,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼入篮,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了幌甘?” 一聲冷哼從身側(cè)響起潮售,我...
    開(kāi)封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锅风,沒(méi)想到半個(gè)月后酥诽,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡皱埠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年肮帐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片边器。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡训枢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出忘巧,到底是詐尸還是另有隱情恒界,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布砚嘴,位于F島的核電站十酣,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏际长。R本人自食惡果不足惜耸采,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望也颤。 院中可真熱鬧洋幻,春花似錦、人聲如沸翅娶。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至燥翅,卻和暖如春骑篙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背森书。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工靶端, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人凛膏。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓杨名,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親猖毫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子台谍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 在機(jī)器學(xué)習(xí)中,很多時(shí)候我們需要Python和C的混合編程吁断,最重要的原因是為了性能效率的提升: 解釋型語(yǔ)言一般比編譯...
    Cer_ml閱讀 11,389評(píng)論 3 21
  • C++調(diào)用python 在C/C++中嵌入Python趁蕊,可以使用Python提供的強(qiáng)大功能,通過(guò)嵌入Python可...
    Bruce_Szh閱讀 13,769評(píng)論 1 7
  • Python是一門功能強(qiáng)大的高級(jí)腳本語(yǔ)言仔役,它的強(qiáng)大不僅表現(xiàn)在其自身的功能上掷伙,而且還表現(xiàn)在其良好的可擴(kuò)展性上,正因如...
    蝴蝶蘭玫瑰閱讀 1,628評(píng)論 0 17
  • 在人最無(wú)助的時(shí)候又兵,往往是最不起眼的文字給人震撼人心的力量任柜。特別喜歡賈平凹先生的一句話:能識(shí)天地之大,能曉人生之難寒波,...
    沐之熙閱讀 270評(píng)論 0 1
  • 我好累啊乘盼,這是我最近聽(tīng)的最多的一句話。 新的一天開(kāi)始了俄烁,你為何還那么“累”绸栅。 因自己是醫(yī)學(xué)生的原因,所以每周都要去...
    菲筆記閱讀 303評(píng)論 0 5