首頁 > 後端開發 > Python教學 > ctypes 如何無縫橋接 Python 和 C/C 函式庫?

ctypes 如何無縫橋接 Python 和 C/C 函式庫?

DDD
發布: 2024-12-26 18:37:14
原創
392 人瀏覽過

How Can ctypes Seamlessly Bridge Python and C/C   Libraries?

使用ctypes 從Python 呼叫C/C

當尋求在Python 和C/C 之間建立橋樑時,ctypes 模組出現為首選。它與 Python 標準庫的無縫整合確保了穩定性和廣泛的可訪問性。與偶爾會遇到問題的 swig 不同,ctypes 在兩種語言之間提供了可靠的橋樑。

ctypes 擅長處理 Python 上的編譯時依賴項,允許您的綁定在任何 Python 安裝上完美運行。支援 ctypes,無論用於編譯的版本如何。

為了說明其用法,請考慮以下名為的C 類Foo:

#include <iostream>

class Foo {
public:
    void bar() {
        std::cout << "Hello" << std::endl;
    }
};
登入後複製

由於ctypes 只能與C 函數交互,因此必須將這些函數宣告為extern "C" :

extern "C" {
    Foo* Foo_new() { return new Foo(); }
    void Foo_bar(Foo* foo) { foo->bar(); }
}
登入後複製

將此程式碼編譯到共享庫中:

g++ -c -fPIC foo.cpp -o foo.o
g++ -shared -Wl,-soname,libfoo.so -o libfoo.so  foo.o
登入後複製

最後,建立一個Python 包裝器來橋接連接:

from ctypes import cdll
lib = cdll.LoadLibrary('./libfoo.so')

class Foo(object):
    def __init__(self):
        self.obj = lib.Foo_new()

    def bar(self):
        lib.Foo_bar(self.obj)
登入後複製

透過此設置,您可以輕鬆地從Python 呼叫C 庫:

f = Foo()
f.bar()  # Prints "Hello" on the screen
登入後複製

ctypes 為建置與C/C 函式庫的Python 綁定提供了一個簡單而高效的解決方案,促進這些程式語言之間的無縫互通性。

以上是ctypes 如何無縫橋接 Python 和 C/C 函式庫?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板