1. 程式人生 > >python3和c/c++的混合程式設計(ctypes的使用)

python3和c/c++的混合程式設計(ctypes的使用)

python作為一種膠水語言具有較高的開發效率, 但是其執行效率比較低, 當計算量比較大時,顯得力不從心.  而ctypes是python下的一個可以連結c/c++的一個庫. 可以將C函式編譯成動態連結庫, 即window下的.dll檔案或者是linux下的.so檔案. 這樣我們通過使用cytpes可以加速程式碼的執行速度.

例如,用printf函式列印

import platform
from ctypes import *

if platform.system() == 'Windows':
    libc = cdll.LoadLibrary('msvcrt.dll')
elif platform.system() =='Linux':
    libc = cdll.LoadLibrary('libc.so.6')
    
libc.printf('Hello world!\n')

1.資料型別, ctypes作為聯絡python和c的介面, 其對應的資料型別如下:

注:Python 中的型別,除了 None,int, long, Byte String,Unicode String 作為 C 函式的引數預設提供轉換外,其它型別都必須顯式提供轉換。

None:對應 C 中的 NULL

intlong: 對應 C 中的 int,具體實現時會根據機器字長自動適配。

特別需要注意的是,在python3中:

Byte String:對應 C 中的一個字串指標 char * ,指向一塊記憶體區域。(字串前面會加小b,  b"helloworld")

Unicode String :對應 C 中一個寬字串指標 wchar_t *,指向一塊記憶體區域。(對應的就是字串, "helloworld")

在python2中恰好相反.

2指定函式的引數型別和返回型別

例如,我們用c++寫一個距離公式,然後用python呼叫.

命名c++檔案為dist.cpp:

#include <cmath>
#include <iostream>
using namespace std;

extern "C" float Dist(float ax,float ay,float az,float bx,float by,float bz){       
	return(sqrt((ax-bx)*(ax-bx)+(ay-by)*(ay-by)+(az-bz)*(az-bz)));}

寫好以後編譯成.so檔案:g++ -o dist.so -shared -fPIC dist.cpp

接著,在python3下用ctypes呼叫dist.so:

test = cdll.LoadLibrary("./dist.so")
test.dist.argtypes = [c_float, c_float, c_float, c_float, c_float, c_float]
test.dist.restype = c_float
a =[3,0,0]
a1 = [0,4,0]
r = test.Dist(c_float(a[0]),c_float(a[1]),c_float(a[2]), c_float(a1[0]),c_float(a1[1]),c_float(a1[2]))
其中test.dist.argtypes = [c_float, c_float, c_float, c_float, c_float, c_float]表示函式的6個引數均為float型, 
test.dist.restype = c_float函式的返回型別為float型.

3.結構體和聯合體(Structures and unions)

>>> from ctypes import *
>>> class POINT(Structure):
...     _fields_ = [("x", c_int),
...                 ("y", c_int)]
...
>>> point = POINT(10, 20)
>>> print point.x, point.y
10 20
>>> point = POINT(y=5)
>>> print point.x, point.y
0 5
>>> POINT(1, 2, 3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: too many initializers
>>>
後續再更新聯合體以及指標等