C語言可以和Python一起混合編程??jī)烧呦嗉訜o敵了!

C語言是面向過程的,而C++是面向?qū)ο蟮?/p>

C語言是編程語言的祖母,但是隨著一代一代的編程語言長(zhǎng)大,所以祖母也是會(huì)拍在沙灘上的,很多小小伙伴應(yīng)該都會(huì)學(xué)過或者了解C語言,因?yàn)檐浖档臅?huì)教嘛,但是Pytho很多人都沒學(xué)過,下面給大家介紹下,C語言和Python一起混合編程會(huì)產(chǎn)生什么不一樣的火花吧!

小編推薦一個(gè)學(xué)C語言/C++的學(xué)習(xí)裙【 二六三,六八八,二七六 】,無論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來了解一起進(jìn)步一起學(xué)習(xí)!裙內(nèi)有開發(fā)工具,很多干貨和技術(shù)資料分享!

1、C/C++調(diào)用Python(基礎(chǔ)篇)

在Mac OS X 下的編譯命令同上

產(chǎn)生可執(zhí)行文件后,直接運(yùn)行,結(jié)果為輸出

Hello Python!

Python庫函數(shù)PyRun_SimpleString可以執(zhí)行字符串形式的Python代碼。雖然非常簡(jiǎn)單,但這段代碼除了能用C語言動(dòng)態(tài)生成一些Python代碼之外,并沒有什么用處。我們需要的是C語言的數(shù)據(jù)結(jié)構(gòu)能夠和Python交互。

下面舉個(gè)例子,比如說,有一天我們用Python寫了一個(gè)功能特別強(qiáng)大的函數(shù):

從上述代碼可以窺見Python內(nèi)部運(yùn)行的方式:

所有Python元素,module、function、tuple、string等等,實(shí)際上都是PyObject。C語言里操縱它們,一律使用PyObject *。

Python的類型與C語言類型可以相互轉(zhuǎn)換。Python類型XXX轉(zhuǎn)換為C語言類型YYY要使用PyXXXAsYYY函數(shù);C類型YYY轉(zhuǎn)換為Python類型XXX要使用PyXXXFromYYY函數(shù)。

也可以創(chuàng)建Python類型的變量,使用PyXXX_New可以創(chuàng)建類型為XXX的變量。

若a是Tuple,則a[i] = b對(duì)應(yīng)于 PyTupleSetItem(a,i,b),有理由相信還有一個(gè)函數(shù)PyTupleGetItem完成取得某一項(xiàng)的值。

不僅Python語言很優(yōu)雅,Python的庫函數(shù)API也非常優(yōu)雅。

現(xiàn)在我們得到了一個(gè)C語言的函數(shù)了,可以寫一個(gè)main測(cè)試它

編譯的方式就用本節(jié)開頭使用的方法。

在Linux/Mac OSX運(yùn)行此示例之前,可能先需要設(shè)置環(huán)境變量:

bash:

export PYTHONPATH=.:$PYTHONPATH

csh:

setenv PYTHONPATH.:$PYTHONPATH

2 Python 調(diào)用 C/C++(基礎(chǔ)篇)

這種做法稱為Python擴(kuò)展。

比如說,我們有一個(gè)功能強(qiáng)大的C函數(shù)

除了功能強(qiáng)大的函數(shù)great_function外,這個(gè)文件中還有以下部分:

包裹函數(shù)greatfunction。它負(fù)責(zé)將Python的參數(shù)轉(zhuǎn)化為C的參數(shù)(PyArgParseTuple),調(diào)用實(shí)際的greatfunction,并處理great_function的返回值,最終返回給Python環(huán)境。

導(dǎo)出表GreateModuleMethods。它負(fù)責(zé)告訴Python這個(gè)模塊里有哪些函數(shù)可以被Python調(diào)用。導(dǎo)出表的名字可以隨便起,每一項(xiàng)有4個(gè)參數(shù):第一個(gè)參數(shù)是提供給Python環(huán)境的函數(shù)名稱,第二個(gè)參數(shù)是greatfunction,即包裹函數(shù)。第三個(gè)參數(shù)的含義是參數(shù)變長(zhǎng),第四個(gè)參數(shù)是一個(gè)說明性的字符串。導(dǎo)出表總是以結(jié)束。

導(dǎo)出函數(shù)initgreat_module。這個(gè)的名字不是任取的,是你的module名稱添加前綴init。導(dǎo)出函數(shù)中將模塊名稱與導(dǎo)出表進(jìn)行連接。

在Windows下面,在Visual Studio命令提示符下編譯這個(gè)文件的命令是

小編推薦一個(gè)學(xué)C語言/C++的學(xué)習(xí)裙【 二六三,六八八,二七六 】,無論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來了解一起進(jìn)步一起學(xué)習(xí)!裙內(nèi)有開發(fā)工具,很多干貨和技術(shù)資料分享!

本部分參考資料

《Python源碼剖析-深度探索動(dòng)態(tài)語言核心技術(shù)》是系統(tǒng)介紹CPython實(shí)現(xiàn)以及運(yùn)行原理的優(yōu)秀教程。

Python 官方文檔的這一章詳細(xì)介紹了C/C++與Python的雙向互動(dòng)Extending and Embedding the Python Interpreter _ _

關(guān)于編譯環(huán)境,本文所述方法僅為出示原理所用。規(guī)范的方式如下:3. Building C and C++ Extensions with distutils _ _

作為字典使用的官方參考文檔Python/C API Reference Manual _ _

3、C/C++調(diào)用Python(使用Cython)

這其中有非Python關(guān)鍵字cdef和public。這些關(guān)鍵字屬于Cython。由于我們需要在C語言中使用“編譯好的Python代碼”,所以得讓great_function從外面變得可見,方法就以“public”修飾。而cdef類似于Python的def,只有使用cdef才可以使用Cython的關(guān)鍵字public。

這個(gè)函數(shù)中其他的部分與正常的Python代碼是一樣的。

接下來編譯 great_module.pyx

編譯命令和第一部分相同:

在Windows下編譯命令為

在Visual Studio命令提示符下編譯:

cl/LD dllmain.cgreat_module.c-IC:Python27includeC:Python27libspython27.lib

會(huì)得到一個(gè)dllmain.dll。我們?cè)贓xcel里面使用它,沒錯(cuò),傳說中的Excel與Python混合編程:

參考資料:Cython的官方文檔

4、Python調(diào)用C/C++(使用SWIG)

接下來使用SWIG將這個(gè)配置文件編譯為所謂Python Module Wrapper

swig-python mymodule.i

得到一個(gè) mymodule_wrap.c和一個(gè)mymodule.py。把它編譯為Python擴(kuò)展:

Windows:

cl/LD mymodule_wrap.c/o_mymodule.pyd-IC:Python27includeC:Python27libspython27.lib

Linux:

gcc-fPIC-shared mymodule_wrap.c-o_mymodule.so-I/usr/include/python2.7/-lpython2.7

注意輸出文件名前面要加一個(gè)下劃線。

現(xiàn)在可以立即在Python下使用這個(gè)module了:

換句話說,SWIG自動(dòng)完成了諸如Python類型轉(zhuǎn)換、module初始化、導(dǎo)出代碼表生成的諸多工作。

對(duì)于C++,SWIG也可以應(yīng)對(duì)。例如以下代碼有C++類的定義:

寫在最后:

由于CPython自身的結(jié)構(gòu)設(shè)計(jì)合理,使得Python的C/C++擴(kuò)展非常容易。如果打算快速完成任務(wù),Cython(C/C++調(diào)用Python)和SWIG(Python調(diào)用C/C++)是很不錯(cuò)的選擇。但是,一旦涉及到比較復(fù)雜的轉(zhuǎn)換任務(wù),無論是繼續(xù)使用Cython還是SWIG,仍然需要學(xué)習(xí)Python源代碼。

這些是C/C++能做的

服務(wù)器開發(fā)工程師、人工智能、云計(jì)算工程師、信息安全(黑客反黑客)、大數(shù)據(jù) 、數(shù)據(jù)平臺(tái)、嵌入式工程師、流媒體服務(wù)器、數(shù)據(jù)控解、圖像處理、音頻視頻開發(fā)工程師、游戲服務(wù)器、分布式系統(tǒng)、游戲輔助等

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個(gè) Awesome - XXX 系列...
    aimaile閱讀 26,836評(píng)論 6 427
  • Python常用庫大全,看看有沒有你需要的。 環(huán)境管理 管理 Python 版本和環(huán)境的工具 p – 非常簡(jiǎn)單的交...
    XDgbh閱讀 15,989評(píng)論 4 147
  • 從廣州學(xué)習(xí)回來兩天了,工作和做雜事之余,房間沒有顧上打掃、換季的衣服沒做交換?;叵胗幸淮吻澳暧幸淮翁鞖馔蝗蛔兝?,被...
    韓彥芳閱讀 331評(píng)論 0 4

友情鏈接更多精彩內(nèi)容