私はpythonを探索しています。 pythonバインディング。
PythonからCで記述されたコードを呼び出す方法はいくつかあります。
まず、標準ライブラリに ctypes モジュールがあります。ダイナミックリンクライブラリ(Windows上のDLL、共有ライブラリ.so
Linuxで)およびこれらのライブラリから関数をPythonから直接呼び出します。このようなライブラリは通常、Cで書かれています。
第二に、CPythonの場合、 Python/C APIがあります。次の2つの主要な方法で使用できます。
ダイナミックリンクライブラリは、CPythonがモジュールとして扱うようにCで作成できます(Pythonプログラムでインポートできます)。Python/ C APIライブラリはCで書かれているがPythonから呼び出し可能な関数を定義できます。APIは非常に強力で、すべてのPythonデータ型を操作し、インタープリターの内部にアクセスする関数を提供します。
C APIを使用する2番目の方法は、Cで記述されたプログラムにPythonを埋め込むことです。Cプログラムは、Cで記述された組み込みモジュールを作成し、C関数を公開できます。 APIにより、プログラムはスクリプトを実行して、組み込みモジュールをインポートして使用することができます。これを使用してPythonベースのプラグインを作成できますシステム。
「バインディング」は、ctypesを使用する純粋なPythonライブラリとして、またはPython/C APIを使用するダイナミックリンクライブラリとして実装されます。2番目のオプションは [〜 #〜] swig [〜#〜] 「ボイラープレート」コードを生成することでタスクを簡単にするか、Python /の上にC++ APIを提供する Boost.Python C APIにより、C++コードとのインターフェースが容易になります。
さらに読む: Foreign Function Interface
答えは簡単です。python(CPython)インタープリターはCで書かれており、他のCライブラリを動的に呼び出すことができ、C拡張モジュールまたは埋め込みCコードは他のCコードから簡単に呼び出すことができます。
CPythonでは、他のCコードを呼び出したり、他のCコードから呼び出したりできるように、特別なフックを使用できます。 C、ネイティブコードにコンパイルされ、同じ呼び出し規約を持つ言語である必要さえありません。
単純なケースとして、mythonというプログラムを作成することを検討してください。mythonは、任意の共有ライブラリをロードし、run
などの関数を呼び出そうとします。
lib = dlopen("mylib.so", RTLD_LAZY);
func = dlsym(lib, "run");
(*func)();
モジュールをロードしてそのコードを呼び出す方法で、CPythonはそれを行いますが、より複雑な方法で、より良いインターフェイスとオブジェクトを提供し、さらにメモリ管理、スレッド管理などに関連する複雑さがあります.
したがって、Python実装のプラットフォームは、それが拡張されている言語と一致する必要があります。 CPythonはJavaで拡張できませんが、JavaのPython実装 Jython はJavaおよび同様に.NET実装 IronPython は.Net言語で拡張できます。