私はPythonを探検しています。私はPythonバインディングについて興味があります。 PythonからどのようにCライブラリにアクセスできるのか誰にも説明できますか?pythonバインディングはどうですか?
答えて
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++コードとのインターフェースを容易にします。
答えは簡単ですが、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言語で拡張できます。
たくさんのものがCで書かれていますが、Cで書かれたものはたくさんあります。 ? –
@Anurag PythonがJavaのように拡張できないのは正しいのですか? – ashim
@ IgnacioVazquez-Abrams編集を参照してください –
- 1. 動的バインディング== Javaでの遅延バインディングかどうか?
- 2. SubversionのPythonバインディングは
- 3. WCFのMSMQバインディングはWsHttpとどう違うのですか?
- 4. GIOのGSocketのPythonバインディングはどこにありますか?
- 5. Python XMLバインディング
- 6. libpartedのPythonバインディング?
- 7. バインディングはWPF/XAMLでどのように機能しますか?
- 8. PythonのSubversionバインディングは `pip`でうまくパッケージ化されていますか?
- 9. Pythonバインディングでcurses用のツールキットライブラリはありますか?
- 10. pythonのdate.toordinal()の逆はどうですか? Pythonでは、
- 11. このPythonの例で演算子バインディングはどのように機能しますか?
- 12. PythonがQtバインディングでハングする
- 13. コレクションへのバインディングはどのように機能しますか?
- 14. WCFバインディングはどのようにクローンしますか?
- 15. この行はPythonではどういう意味ですか?
- 16. * =はPythonではどういう意味ですか?
- 17. Pythonでは%sはどういう意味ですか?
- 18. python jsonバインディング:なぜこのようなコードを書くのですか?
- 19. CollectionView.Sourceのバインディングを変更するにはどうすればよいですか?
- 20. Generator for Python <--> XMLバインディング
- 21. OpenCV Pythonバインディングfor GrabCutアルゴリズム
- 22. macforsとのfontforgeのPythonバインディング
- 23. python:バインディングのしくみ
- 24. Python/C++バインディング、distutilsでstatics C++ライブラリ(portaudio)をもう一度リンクする方法は?
- 25. torrent_info()とlibtorrentのPythonバインディングでのマグネットリンク
- 26. Python AppIndicatorバインディング - > howtoがメニューが開いているかどうかを確認しますか?ここ
- 27. 動的バインディングはどのようにJavaで実装されていますか?
- 28. GuiceはServletContext/ServletConfigでバインディングをどのように渡しますか?
- 29. このシナリオで遅延バインディングはどのように機能しますか?
- 30. セレンのバインディングはどのように機能し、どうすれば使用できますか?
[extemb]の一部(http://docs.python.org/extending/index.html)あなたは理解していませんか? –
"Python C bindings"のGoogle検索をお勧めします。 – steveha
"私はPythonを探検しています。「すべてのPythonについて学ぶことは素晴らしいことですが、Cバインディングを深く検討する前に、Pythonモデルをよく理解しておくべきでしょう。 。 –