ホームページ > バックエンド開発 > Python チュートリアル > ctypes はどのようにして Python と C/C ライブラリをシームレスにブリッジできるのでしょうか?

ctypes はどのようにして Python と C/C ライブラリをシームレスにブリッジできるのでしょうか?

DDD
リリース: 2024-12-26 18:37:14
オリジナル
384 人が閲覧しました

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

ctypes を使用して Python から C/C を呼び出す

Python と C/C の間のブリッジを確立しようとする場合、 ctypes モジュールは次のように表示されます。好ましい選択です。 Python の標準ライブラリとのシームレスな統合により、安定性と広範なアクセシビリティが保証されます。時折問題が発生する可能性がある swig とは異なり、ctypes は 2 つの言語間に信頼できるブリッジを提供します。

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 ラッパーを作成して、 connection:

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 中国語 Web サイトの他の関連記事を参照してください。

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