首頁 >後端開發 >Python教學 >Python的ctypes模組如何與C/C函式庫無縫整合?

Python的ctypes模組如何與C/C函式庫無縫整合?

Linda Hamilton
Linda Hamilton原創
2024-12-11 12:29:11656瀏覽

How Can Python's ctypes Module Seamlessly Integrate with C/C   Libraries?

利用 Python 進行 C/C 整合

Python 提供了與外部程式庫互動的多種功能。一個常見的場景是從 Python 中呼叫 C 或 C 函數。為了實現這一點,部署 ctypes 模組是一種有效的方法。與某些第三方工具相比,ctypes 嵌入在 Python 標準庫中,確保了更高的穩定性和廣泛可用性。

利用 ctypes 使您能夠規避對 Python 的編譯時依賴。因此,任何配備 ctypes 的 Python 實例都可以利用您的綁定,無論編譯期間使用的版本為何。

為了說明 ctypes 的用法,讓我們考慮一個基本的 C 類 Foo,它在名為 foo 的檔案中定義。 cpp:

#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()  # Output: "Hello" displayed on screen

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn