2012-04-18 6 views
18

私はPythonを探検しています。私はPythonバインディングについて興味があります。 PythonからどのようにCライブラリにアクセスできるのか誰にも説明できますか?pythonバインディングはどうですか?

+1

[extemb]の一部(http://docs.python.org/extending/index.html)あなたは理解していませんか? –

+1

"Python C bindings"のGoogle検索をお勧めします。 – steveha

+2

"私はPythonを探検しています。「すべてのPythonについて学ぶことは素晴らしいことですが、Cバインディングを深く検討する前に、Pythonモデルをよく理解しておくべきでしょう。 。 –

答えて

25

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

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

第2に、CPythonの場合、Python/C APIがあります。

動的リンクライブラリは、CPythonがモジュールとして扱うように書くことができます(Pythonプログラムでインポートすることができます)。 Python/C APIを使用すると、ライブラリでC言語で書かれていてもPythonから呼び出し可能な関数を定義できます。 APIは非常に強力で、すべてのPythonデータ型を操作し、インタプリタの内部にアクセスする関数を提供します。

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

"バインディング"は、ctypesを使用した純粋なPythonライブラリとして、またはPython/C APIを使用したダイナミックリンクライブラリとして実装されています。 2番目のオプションは、のようなツールで使用されることがあります。これは、 "boiler-plate"コードを生成することによってタスクを容易にします。Boost.PythonはPython/C APIの上にC++ APIを提供し、C++コードとのインターフェースを容易にします。

さらに読み:Foreign Function Interface

6

答えは簡単ですが、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言語で拡張できます。

+2

たくさんのものがCで書かれていますが、Cで書かれたものはたくさんあります。 ? –

+0

@Anurag PythonがJavaのように拡張できないのは正しいのですか? – ashim

+0

@ IgnacioVazquez-Abrams編集を参照してください –

関連する問題