如何在Python中呼叫C函式


在Python中呼叫C函式可以極大地增強程式的功能,透過整合C庫的功能。Python以其簡潔性和多功能性而聞名,提供了多種方法來無縫整合C程式碼,從而提高效能並訪問底層系統API。本文探討了在Python中呼叫C函式的主題,重點介紹了利用Python優勢的不同方法。一種常用的方法是使用ctypes庫,它允許直接從動態連結庫呼叫C函式。我們還將深入研究CFFI庫,它為呼叫C函式提供了一個高階介面,以及ctypes與numpy庫的強大組合,以有效地處理數值資料。此外,我們將簡要介紹Cython語言,它可以使用Python語法建立C擴充套件。透過掌握這些技術,我們可以利用C的強大功能在Python程式碼中,釋放更強大的程式設計能力,並能夠解決各種各樣的任務。

使用ctypes庫

Python ctypes庫是一個強大的資源,使我們能夠生成與C相容的資料型別,並使用Python直接呼叫動態連結庫或共享庫中的函式。下面,您將找到一個全面的演練,詳細說明如何使用ctypes呼叫C函式。

步驟1:匯入ctypes模組

import ctypes

步驟2:載入包含C函式的共享庫

lib = ctypes.CDLL('./mylibrary.so')

此步驟將共享庫檔案載入到記憶體中,使其中的函式可訪問。

步驟3:宣告函式原型

my_function = lib.my_function
my_function.argtypes = [ctypes.c_int, ctypes.c_int]
my_function.restype = ctypes.c_int

在此步驟中,我們透過將庫中的C函式與Python變數關聯來建立函式原型。此外,我們使用argtypes定義引數型別,使用restype定義返回型別。

步驟4:從Python呼叫C函式

result = my_function(5, 10)
print(result)

最後,我們可以像呼叫任何其他Python函式一樣呼叫C函式。傳遞所需的引數,它將執行相應的C程式碼。C函式返回的結果可以儲存在一個變數中,並在您的Python程式中進一步列印或使用。

使用CFFI庫

CFFI(C外部函式介面)是另一個允許從Python呼叫C函式的庫。與ctypes相比,它提供了一個更高級別的介面,並支援更廣泛的C特性。這是一個例子

步驟1:安裝cffi庫

使用命令pip install cffi在您的系統上安裝CFFI庫。

步驟2:匯入cffi模組並建立一個CFFI介面物件

在您的Python程式碼中,匯入cffi模組以訪問其功能。然後,使用以下程式碼建立一個CFFI介面物件

import cffi
ffi = cffi.FFI()

步驟3:使用CFFI語法定義C函式原型

使用CFFI庫時,需要在從Python呼叫C函式之前定義C函式原型。為此,我們可以使用ffi.cdef()函式,該函式允許我們使用C語法指定函式簽名。透過提供正確的函式簽名,CFFI可以瞭解C函式的引數和返回型別,從而實現Python和C之間的無縫通訊。這是一個示例程式碼

ffi.cdef("""
    int my_function(int a, int b);
""")

步驟4:載入共享庫並獲取C函式指標

要使用CFFI庫載入包含所需C函式的共享庫,我們可以使用ffi.dlopen()函式。此函式由CFFI提供,使我們能夠指定共享庫檔案的路徑(例如.so檔案)。它返回一個庫控制代碼,使我們能夠訪問庫中的C函式。這是一個說明該過程的示例

lib = ffi.dlopen('./mylibrary.so')
my_function = lib.my_function

步驟5:從Python呼叫C函式

獲取C函式指標後,呼叫C函式就像呼叫任何其他Python函式一樣簡單。只需按照C函式原型指定的格式提供引數。這是一個例子

result = my_function(5, 10)

透過遵循這些步驟,我們可以有效地使用CFFI庫從Python呼叫C函式,彌合兩種語言之間的差距,並在Python程式碼中利用C的強大功能。

使用Cython語言

Cython擴充套件了Python的語法,可以使用類似Python的方式建立C擴充套件。它充當Python和C之間的橋樑,允許開發人員將Python的簡潔性與C的效能相結合。使用Cython,您可以利用Python的高階特性,同時將低階的C功能無縫地整合到您的程式碼中。

步驟1:建立一個.pyx檔案(例如,mymodule.pyx),內容如下:

cdef extern from "./myheader.h":
    int my_function(int a, int b)

def call_c_function(int a, int b):
    return my_function(a, b)

步驟2:建立一個setup.py檔案,內容如下:

from setuptools import setup
from Cython.Build import cythonize

setup(
    ext_modules=cythonize("mymodule.pyx")
)

步驟3:編譯Cython模組

要編譯Cython模組,請在終端中導航到包含setup.py檔案的目錄,並執行以下命令:

python setup.py build_ext --inplace

此命令將生成必要的C檔案並將其編譯成共享庫。

步驟4:匯入模組並呼叫C函式

import mymodule

result = mymodule.call_c_function(5, 10)
print(result)

結論

總而言之,能夠在Python中呼叫C函式提供了一種強大的方法,可以將高效能能力和直接系統訪問整合到Python應用程式中。透過使用ctypes、CFFI和Cython等庫,開發人員可以輕鬆地連線Python和C,有效地彌合兩種語言之間的差距。無論您是想最佳化計算密集型任務、與硬體裝置互動,還是利用現有的C庫,這些技術都提供了卓越的靈活性和效率。透過掌握在Python中呼叫C函式的技巧,開發人員可以訪問各種可能性,從而能夠克服各種程式設計挑戰,同時結合兩者的優勢。

更新於:2023年7月20日

8K+ 次瀏覽

啟動您的職業生涯

透過完成課程獲得認證

開始學習
廣告