python可以呼叫c語言的底層程式碼嗎?西北第一吃漢2021-07-01 18:11:42

python可以呼叫c語言萊垍頭條

python語言呼叫c語言進行擴充套件,或者增加程式的執行速度都是特別方便的。同時還能獲得與C或者C++幾乎相同的執行效能。萊垍頭條

Python呼叫C語言的方式條萊垍頭

CTYPES,萊垍頭條

SWIG,條萊垍頭

BOOST。PYTHON,垍頭條萊

CYTHON垍頭條萊

python是解釋型語言,只能呼叫c的動態連結庫。垍頭條萊

那什麼是庫,什麼是靜態庫與動態庫?萊垍頭條

庫是寫好的現有的,成熟的,可以複用的程式碼。現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的程式碼都從零開始,因此庫的存在意義非同尋常。萊垍頭條

本質上來說庫是一種可執行程式碼的二進位制形式,可以被作業系統載入記憶體執行。庫有兩種:靜態庫(。a、。lib)和動態庫(。so、。dll)。萊垍頭條

靜態庫與動態庫的區別萊垍頭條

靜態庫與動態庫的區別主要是在連結階段,分別稱為靜態連結方式與動態連結方式。萊垍頭條

靜態庫是連結階段,會將彙編生成的目標檔案。o與引用到的庫一起連結打包到可執行檔案中。萊垍頭條

動態庫在程式編譯時並不會被連線到目的碼中,而是在程式執行是才被載入萊垍頭條

為什麼需要動態庫?萊垍頭條

靜態庫在記憶體中存在多份複製導致空間浪費,假如靜態庫佔1M記憶體,有2000個這樣的程式,將佔用2GB的空間萊垍頭條

靜態庫對程式的更新、部署和釋出頁會帶來麻煩。如果靜態庫liba。lib更新了,所以使用它的應用程式都需要重新編譯、釋出給使用者。萊垍頭條

建立動態庫與靜態庫萊垍頭條

靜態庫萊垍頭條

生成。o檔案萊垍頭條

g++ -c StaticMath。cpp頭條萊垍

生成。a檔案條萊垍頭

ar -crv libstaticmath。a StaticMath。o萊垍頭條

動態庫垍頭條萊

For Linux萊垍頭條

$ gcc -shared -Wl,-soname,adder -o adder。so -fPIC add。c萊垍頭條

For Mac萊垍頭條

$ gcc -shared -Wl,-install_name,adder。so -o adder。so -fPIC add。c萊垍頭條

For windows垍頭條萊

$gcc -shared -Wl,-soname,adder -o adder。dll -fPIC add。c垍頭條萊

extern 和 static萊垍頭條

extern對應的關鍵字是static,被它修飾的全域性變數和函式只能在本模組中使用。而extern修飾代表可以在本模組外使用。萊垍頭條

三步簡化c的呼叫萊垍頭條

Python中的ctypes模組可能是Python呼叫C方法中最簡單的一種。ctypes模組提供了和C語言相容的資料型別和函式來載入dll檔案,因此在呼叫時不需對原始檔做任何的修改。萊垍頭條

一、編寫c萊垍頭條

#include萊垍頭條

int add_int(int, int);萊垍頭條

float add_float(float, float);萊垍頭條

int add_int(int num1, int num2){萊垍頭條

return num1 + num2;條萊垍頭

}頭條萊垍

float add_float(float num1, float num2){萊垍頭條

return num1 + num2;萊垍頭條

}頭條萊垍

二、編譯為動態連結庫條萊垍頭

gcc -shared -Wl,-soname,adder -o adder。so -fPIC add。c萊垍頭條

三、py呼叫c垍頭條萊

from ctypes import *萊垍頭條

#load the shared object file萊垍頭條

adder = CDLL(‘。/adder。so’)萊垍頭條

#Find sum of integers萊垍頭條

res_int = adder。add_int(4,5)萊垍頭條

print “Sum of 4 and 5 = ” + str(res_int)條萊垍頭

#Find sum of floats萊垍頭條

a = c_float(5。5)萊垍頭條

b = c_float(4。1)萊垍頭條

add_float = adder。add_float萊垍頭條

add_float。restype = c_float萊垍頭條

print “Sum of 5。5 and 4。1 = ”, str(add_float(a, b))頭條萊垍