C++ コードを書き、それを Python から呼び出せるようにしたい場合は、Python インタープリターの拡張と埋め込みを行います。(実際には、拡張のみです。残りの半分は無視してください。)
基本的に、新しいモジュールを作成すればfoo
、誰でもimport foo
呼び出すことができ、モジュールが Python ファイルとして実装されているか、動的ライブラリにコンパイルされているfoo.a("a")
かは関係ありません。foo
foo.py
foo.cpp
foo.so
そのためには、Kyle C が示唆しているように、これを行うための高レベルの方法がいくつかあるため、C API を直接処理する必要はありません。(彼の Boost.Python の提案に加えて、Cython
Python に直接公開しながら、C++ と直接やり取りできるほぼ Python 言語でコードを記述できる も参照することをお勧めします。)
しかし、それはあなたが求めたものではありません。あなたができるようにしたいのは、Python コードで定義された関数を取り、それをフックして別のことを行うことです。そのためには、上にリンクされている拡張と埋め込みのドキュメントを読む必要があります。埋め込みインタープリターを作成し、いくつかの動作を再現する必要があります (正確にどれだけフックするかによって異なります) PyObject_Call
。そのオブジェクトがa
関数であり、そうであれば、フック コードを呼び出します。
これはかなり難しいでしょう。組み込みの Python インタープリターをまだ作成していない場合は、それをフックする方法を考える前に作成してください。
インタープリターの外部からフックするよりも、Python 内からフックする方がおそらくはるかに簡単であることは注目に値します。(「monkeypatching」について聞いたことがない場合は、Google にアクセスしてください。) また、C++ でビルドしたモジュールから Python フック呼び出しコードをいつでも作成したり、.so ファイルを介してコンパイル済みの .so ファイルに直接呼び出したりすることができますctypes
。
最後に、実行中のインタープリター インスタンスを実行時にフックしたい場合、それはさらに困難です。明らかに、ある種のデバッグ/トレース/などを実行できる必要があります。アタッチとコード挿入、およびその詳細はプラットフォームに完全に依存します。PyObject_Call
次に、 ( libpython.so
/ Python.dll
/ Python.framework
/whatever からの) への呼び出しをインターセプトして最初にフックを通過する必要があることを除いて、以前のハード バージョンで行ったのと同じことを行う必要があります。. プラットフォームで SO 呼び出しをフックする方法をまだ知らない場合は、外部から Python コードをフックすることを考える前に、それを学ぶ必要があります。