利用できるC++の機能を拡張Python?
-
19-09-2019 - |
質問
Pythonのマニュアルは作成できるモジュールはPythonの両方のCおよびC++.で利用いただきますような授業やテンプレート使用時C++?のではないでしを混触危険物質を避け、他の図書館や通訳は?
解決
なるかどうかの実装がフック関数はCまたはC++.このソフトの存在により、いくつかのPython拡張を積極的に活用C++テンプレートとも、ブ図書館があります。 問題ありません。 :-)
他のヒント
ブーストの人々は、Pythonで使用するためのC ++コードのラッピングを行うには素敵な自動化された方法を持っています。
これが呼び出されます。Boost.Python
これはSWIGよりもC ++より良いの構築体の一部、特にテンプレートメタプログラミングを扱っています。
あなたが興味を持っていることは SWIG に呼ばれるプログラムです。これは、C ++コード用のPythonラッパーとインターフェイスを生成します。私は、テンプレート、継承、名前空間などでそれを使用して、それがうまく機能します。
あなたは、C ++言語のすべての機能を使用することができるはずです。 あなたがC ++を使用することを言いますが、言及のPythonドキュメント(2.6.2)を拡張以下の注意事項:
拡張機能を記述することが可能です C ++のモジュール。いくつかの制限 適用されます。もしメインプログラム(Pythonの インタプリタは)でコンパイルとリンクされています Cコンパイラ、グローバルまたは静的 コンストラクタを持つオブジェクトにすることはできません 中古。場合、これは問題ではありません メインプログラムは、Cによってリンクされている++ コンパイラ。なります機能 Pythonインタプリタによって呼び出される(中 特に、モジュールの初期化 機能)を使用して宣言する必要があります extern "C"。それはに不必要です Pythonのヘッダファイルを囲んで extern "C" {...} - 彼らはこの形式を使用します すでにシンボル__cplusplusがある場合 定義された(最近のすべてのC ++コンパイラ このシンボルを定義する)。
第一の制限、「コンストラクタを持つグローバルまたは静的オブジェクトを使用することはできない」、ほとんどのC ++コンパイラは、保存期間のこのタイプのオブジェクトを初期化する方法に関係しています。たとえば、次のコードを考えてみます:
class Foo { Foo() { } };
static Foo f;
int main(int argc, char** argv) {}
コンパイラは、主が実行される前に「foo」でコンストラクタが「F」のために呼び出されるように特別なコードを放出しなければなりません。あなたはPythonの拡張に静的記憶域期間を持つオブジェクトを使用している場合のとのPythonインタプリタがコンパイルおよびC ++のためにリンクされていない、この特別な初期化コードが作成されません。
第二の制限、「C 『』 Pythonのインタープリター(特に、モジュール初期化関数)によって呼び出される関数EXTERNを使用して宣言されなければならない」、C ++ネームマングリングに関係しています。彼らはCのツールチェーンのために提供される同じリンカーを使用できるように、ほとんどのC ++コンパイラは、自分の名前をマングル。たとえば、あなたが持っていたと言うます:
void a_function_python_calls(void* foo);
C ++コンパイラは、「1vga @ a_function_python_calls」のような何かに名「a_function_python_calls」への参照を変換することができます。その場合、あなたは、Pythonライブラリをリンクしようとすると、未解決の外部を得ることができます。