欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

python可以調用c語言的底層代碼嗎

錢衛國2年前11瀏覽0評論

python可以調用c語言的底層代碼嗎?

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))