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

Python の ctypes モジュールはどのようにして C/C ライブラリとシームレスに統合できますか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-11 12:29:11652ブラウズ

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

C/C 統合に Python を利用する

Python は、外部ライブラリとインターフェースするための多彩な機能を提供します。一般的なシナリオの 1 つは、Python 内から C または C 関数を呼び出すことです。これを実現するには、ctypes モジュールをデプロイすることが効果的なアプローチです。特定のサードパーティ ツールとは対照的に、ctypes は Python 標準ライブラリに埋め込まれているため、安定性が向上し、広く利用できるようになります。

ctypes を利用すると、Python へのコンパイル時の依存関係を回避できます。したがって、ctypes を備えた Python インスタンスは、コンパイル中に使用されるバージョンに関係なく、バインディングを利用できます。

ctypes の使用法を説明するために、foo という名前のファイルで定義されている基本的な C クラス 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。