ホームページ > バックエンド開発 > Python チュートリアル > ctypes を使用して C/C ライブラリの Python バインディングを効率的に作成するにはどうすればよいですか?

ctypes を使用して C/C ライブラリの Python バインディングを効率的に作成するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-15 21:52:11
オリジナル
142 人が閲覧しました

How Can I Efficiently Create Python Bindings for C/C   Libraries Using ctypes?

Python による C/C のインターフェース

Python は使いやすさと拡張性により、あらゆるレベルのプログラマーにとって魅力的な言語です。ただし、既存の C/C ライブラリとの統合が望ましい場合もあります。この記事では、これらのライブラリの Python バインディングを構築するための最も効率的な方法について説明します。

Python の標準ライブラリの一部である ctypes モジュールは、このタスクに対して安定した広く利用可能なソリューションを提供します。他のバインディング メソッドとは異なり、ctypes はコンパイルされた Python のバージョンに依存せず、さまざまな Python インストールとの互換性を確保します。

C で書かれた次のコード スニペットを考えてみましょう。

#include <iostream>

class Foo{
    public:
        void bar(){
            std::cout << "Hello" << std::endl;
        }
};
ログイン後にコピー

これを Python とインターフェースするには、ctypes が認識できるように関数を 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" to standard output
ログイン後にコピー

以上がctypes を使用して C/C ライブラリの Python バインディングを効率的に作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート