ホームページ > バックエンド開発 > Python チュートリアル > Ctypes は Windows 上で Python と C/C をどのように効率的にブリッジできるのでしょうか?

Ctypes は Windows 上で Python と C/C をどのように効率的にブリッジできるのでしょうか?

Linda Hamilton
リリース: 2024-12-31 12:33:20
オリジナル
632 人が閲覧しました

How Can Ctypes Efficiently Bridge Python and C/C   on Windows?

Python から C/C を呼び出す

Windows システムで作業する場合、Python を C/C ライブラリに効率的にバインドすることが重要です。利用可能なオプションの中で、ctypes モジュールは魅力的な選択肢として際立っています。

バインディングに Ctypes を利用する

Ctypes は Python の標準ライブラリの不可欠な部分です。この固有の安定性と幅広い可用性により、他の代替手段と比較して有利なオプションとなります。さらに、ctypes バインディングは、コンパイル中に使用されるものだけでなく、ctypes をサポートするすべてのバージョンの Python でシームレスに動作するように調整されています。

Ctypes を使用した Python バインディングの構築

で定義された Foo という名前の簡略化された C クラスを考えてみましょう。 foo.cpp:

#include <iostream>

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

ctypes 経由で Python との通信を容易にするには、その関数を 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 ラッパーを作成します (例: fooWrapper.py):

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)
ログイン後にコピー

このラッパーを使用すると、C クラスと対話できます:

f = Foo()
f.bar() # Outputs "Hello" to the screen
ログイン後にコピー

Ctypes の利点

Ctypes は、C/C コードを Python にバインドするプロセスを簡素化し、Windows システム上で安定した広く適用可能なソリューションを提供します。 Python のネイティブ ライブラリとインターフェースするための堅牢で相互互換性のあるアプローチを提供します。

以上がCtypes は Windows 上で Python と C/C をどのように効率的にブリッジできるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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