ホームページ >バックエンド開発 >Python チュートリアル >Python の ctypes モジュールはどのようにして C/C ライブラリとシームレスに統合できますか?
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 サイトの他の関連記事を参照してください。