55

私はパイソンを調べています。Pythonバインディングに興味があります。Python から C ライブラリにアクセスできる方法を説明してください。

4

2 に答える 2

62

PythonからCで記述されたコードを呼び出す方法はいくつかあります。

まず、標準ライブラリにctypesモジュールがあります。ダイナミックリンクライブラリ(WindowsではDLL、.soLinuxでは共有ライブラリ)をロードし、Pythonから直接これらのライブラリから関数を呼び出すことができます。このようなライブラリは通常、Cで記述されています。

次に、Python /CAPICPythonがある場合。これは、主に2つの方法で使用できます。

ダイナミックリンクライブラリはCPython、モジュールとして扱うようにCで記述できます(Pythonプログラムにインポートできるようになります)。Python / C APIを使用すると、ライブラリはCで記述されているが、Pythonから呼び出すことができる関数を定義できます。APIは非常に強力で、すべてのPythonデータ型を操作し、インタープリターの内部にアクセスするための関数を提供します。

C APIを使用する2番目の方法は、PythonをCで記述されたプログラムに埋め込むことです。Cプログラムは、ダイナミックリンクライブラリのアプローチと同様に、Cで記述された組み込みモジュールを作成し、C関数を公開できます。APIを使用すると、プログラムでスクリプトを実行して、組み込みモジュールをインポートして使用することもできます。これを使用して、Pythonベースのプラグインシステムを作成できます。

「バインディング」は、ctypesPython / C APIを使用した純粋なPythonライブラリとして、またはPython /CAPIを使用したダイナミックリンクライブラリとして実装されます。2番目のオプションは、「ボイラープレート」コードの生成を処理することでタスクを容易にするSWIGや、Python /CAPIの上にC++APIを提供してC++とのインターフェイスを容易にするBoost.Pythonなどのツールで使用されることがあります。コード。

さらに読む:Foreign Function Interface

于 2012-04-18T03:59:47.490 に答える
16

答えは簡単です。Python (CPython) インタープリターは C で記述されており、他の C ライブラリを動的に呼び出すことができます。C 拡張モジュールまたは組み込み C コードは、他の C コードから簡単に呼び出すことができます。

CPython では、他の C コードを呼び出したり、他の C コードから呼び出すことができるように、特別なフックが許可されています。ネイティブ コードにコンパイルされ、同じ呼び出し規則を持つ言語である C である必要はありません。

簡単なケースとして、mython という名前のプログラムを作成することを考えてみましょう。このプログラムは、任意の共有ライブラリをロードして関数を呼び出そうとしますrun

lib = dlopen("mylib.so", RTLD_LAZY);
func = dlsym(lib, "run");
(*func)();

したがって、モジュールをロードしてそのコードを呼び出す方法で、CPython はそれを行いますが、より複雑な方法で、より優れたインターフェイスとオブジェクトを渡します。さらに、メモリ管理、スレッド管理などに関連するその他の複雑さがあります。

したがって、Python 実装のプラットフォームは、拡張される言語と一致する必要があります。たとえば、CPython は Java では拡張できませんが、Jythonと呼ばれる Python の Java 実装はJava で拡張でき、同様に .NET 実装のIronPythonは .Net 言語で拡張できます。

于 2012-04-18T03:31:59.610 に答える