成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

你試過C語言和Python一起混合編程嗎?兩者相加不是已經無敵了!

新聞 前端
C語言是編程語言的祖母,但是隨著一代一代的編程語言長大,所以祖母也是會拍在沙灘上的,很多小小伙伴應該都會學過或者了解C語言,因為軟件系的會教嘛,但是Python我想很多人都沒學過,下面小編給大家介紹下,C語言和Python一起混合編程會產生什么不一樣的火花吧!

C語言是編程語言的祖母,但是隨著一代一代的編程語言長大,所以祖母也是會拍在沙灘上的,很多小小伙伴應該都會學過或者了解C語言,因為軟件系的會教嘛,但是Python我想很多人都沒學過,下面小編給大家介紹下,C語言和Python一起混合編程會產生什么不一樣的火花吧!

你試過C語言和Python一起混合編程嗎?兩者相加不是已經無敵了!

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

[[212895]]

產生可執行文件后,直接運行,結果為輸出

1

2

Hello Python!

Python庫函數PyRun_SimpleString可以執行字符串形式的Python代碼。

雖然非常簡單,但這段代碼除了能用C語言動態生成一些Python代碼之外,并沒有什么用處。我們需要的是C語言的數據結構能夠和Python交互。

下面舉個例子,比如說,有一天我們用Python寫了一個功能特別強大的函數:

你試過C語言和Python一起混合編程嗎?兩者相加不是已經無敵了!

你試過C語言和Python一起混合編程嗎?兩者相加不是已經無敵了!

從上述代碼可以窺見Python內部運行的方式:

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

  • Python的類型與C語言類型可以相互轉換。Python類型XXX轉換為C語言類型YYY要使用PyXXXAsYYY函數;C類型YYY轉換為Python類型XXX要使用PyXXXFromYYY函數。

  • 也可以創建Python類型的變量,使用PyXXX_New可以創建類型為XXX的變量。

  • 若a是Tuple,則a[i] = b對應于 PyTupleSetItem(a,i,b),有理由相信還有一個函數PyTupleGetItem完成取得某一項的值。

  • 不僅Python語言很優雅,Python的庫函數API也非常優雅。

現在我們得到了一個C語言的函數了,可以寫一個main測試它

你試過C語言和Python一起混合編程嗎?兩者相加不是已經無敵了!

編譯的方式就用本節開頭使用的方法。

在Linux/Mac OSX運行此示例之前,可能先需要設置環境變量:

bash:

1

2

export PYTHONPATH=.:$PYTHONPATH

csh:

1

2

setenv PYTHONPATH.:$PYTHONPATH

2 Python 調用 C/C++(基礎篇)

這種做法稱為Python擴展。

比如說,我們有一個功能強大的C函數

你試過C語言和Python一起混合編程嗎?兩者相加不是已經無敵了!

你試過C語言和Python一起混合編程嗎?兩者相加不是已經無敵了!

除了功能強大的函數great_function外,這個文件中還有以下部分:

  • 包裹函數greatfunction。它負責將Python的參數轉化為C的參數(PyArgParseTuple),調用實際的greatfunction,并處理great_function的返回值,最終返回給Python環境。

  • 導出表GreateModuleMethods。它負責告訴Python這個模塊里有哪些函數可以被Python調用。導出表的名字可以隨便起,每一項有4個參數:***個參數是提供給Python環境的函數名稱,第二個參數是greatfunction,即包裹函數。第三個參數的含義是參數變長,第四個參數是一個說明性的字符串。導出表總是以{NULL, NULL, 0, NULL}結束。

  • 導出函數initgreat_module。這個的名字不是任取的,是你的module名稱添加前綴init。導出函數中將模塊名稱與導出表進行連接。

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

你試過C語言和Python一起混合編程嗎?兩者相加不是已經無敵了!

本部分參考資料

  • 《Python源碼剖析-深度探索動態語言核心技術》是系統介紹CPython實現以及運行原理的優秀教程。

  • Python 官方文檔的這一章詳細介紹了C/C++與Python的雙向互動Extending and Embedding the Python Interpreter _ _

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

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

你試過C語言和Python一起混合編程嗎?兩者相加不是已經無敵了!

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

這個函數中其他的部分與正常的Python代碼是一樣的。

接下來編譯 great_module.pyx

你試過C語言和Python一起混合編程嗎?兩者相加不是已經無敵了!

你試過C語言和Python一起混合編程嗎?兩者相加不是已經無敵了!

編譯命令和***部分相同:

在Windows下編譯命令為

你試過C語言和Python一起混合編程嗎?兩者相加不是已經無敵了!

你試過C語言和Python一起混合編程嗎?兩者相加不是已經無敵了!

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

1

2

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

會得到一個dllmain.dll。我們在Excel里面使用它,沒錯,傳說中的Excel與Python混合編程:

你試過C語言和Python一起混合編程嗎?兩者相加不是已經無敵了!

參考資料:Cython的官方文檔,質量非常高:

你試過C語言和Python一起混合編程嗎?兩者相加不是已經無敵了!

你試過C語言和Python一起混合編程嗎?兩者相加不是已經無敵了!

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

1

2

swig-python mymodule.i

得到一個 mymodule_wrap.c和一個mymodule.py。把它編譯為Python擴展:

Windows:

1

2

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

Linux:

1

2

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

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

現在可以立即在Python下使用這個module了:

你試過C語言和Python一起混合編程嗎?兩者相加不是已經無敵了!

換句話說,SWIG自動完成了諸如Python類型轉換、module初始化、導出代碼表生成的諸多工作。

對于C++,SWIG也可以應對。例如以下代碼有C++類的定義:

你試過C語言和Python一起混合編程嗎?兩者相加不是已經無敵了!

你試過C語言和Python一起混合編程嗎?兩者相加不是已經無敵了!

寫在***:

由于CPython自身的結構設計合理,使得Python的C/C++擴展非常容易。如果打算快速完成任務,Cython(C/C++調用Python)和SWIG(Python調用C/C++)是很不錯的選擇。但是,一旦涉及到比較復雜的轉換任務,無論是繼續使用Cython還是SWIG,仍然需要學習Python源代碼。

責任編輯:張燕妮 來源: 頭條科技
相關推薦

2009-07-20 09:53:43

Java混合編程

2011-07-01 14:55:28

Qt QML C++

2010-03-23 17:44:10

Java Socket

2021-10-11 10:25:33

排列nums數組

2013-03-12 13:52:56

編程

2023-08-10 08:28:46

網絡編程通信

2011-02-15 13:12:02

JavaC++

2017-07-28 09:39:12

隱式IntentAndroid M

2024-02-04 09:27:09

ReactNativeJS

2014-05-13 09:43:12

編程語言開發技巧

2012-04-16 13:22:56

CORBAJavaC++

2013-08-01 09:08:21

編程語言

2013-08-01 09:33:52

編程語言胖手編程編程姿勢

2019-02-20 13:52:18

C語言語法結構程序

2012-04-28 15:28:21

JNI混合編程Java

2025-01-09 07:54:03

2015-02-09 09:26:26

程序員

2015-02-09 10:55:50

編程女程序員

2015-08-21 09:48:11

女朋友編程學習編程

2022-05-30 08:24:33

NomadKubernetesLinux
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久不卡 | 99久久久久久99国产精品免 | av网站免费观看 | 久久精品国产v日韩v亚洲 | 国产精品地址 | 日韩高清中文字幕 | 2021狠狠干 | 91在线网站 | 久久三区 | 国产精品久久性 | 国产中文字幕在线观看 | 欧美男人亚洲天堂 | 欧美激情在线精品一区二区三区 | 欧美最猛黑人 | 男女国产网站 | 99精品视频在线 | 又黑又粗又长的欧美一区 | 亚洲成人www | 精品无码久久久久久国产 | v片网站 | 国产91丝袜在线18 | 区一区二区三在线观看 | 中文字幕一区二区三区在线乱码 | 精品久久精品 | 国产第一页在线观看 | 亚洲综合无码一区二区 | 91视频一88av| 成人精品一区亚洲午夜久久久 | 天天弄天天操 | www国产成人免费观看视频,深夜成人网 | 成在线人视频免费视频 | 成人在线观看网站 | 日韩欧美亚洲一区 | 国产成人精品一区二 | 免费看91 | 99精品网 | 精品福利一区二区三区 | 在线播放精品视频 | 欧美亚洲成人网 | 久久乐国产精品 | 亚洲一区二区中文字幕 |