Python の利点は高い開発効率と使いやすさであり、C の利点は高い操作効率であることは誰もが知っています。Python プロジェクトに C コードを埋め込む場合でも、Python を使用してペリフェラルを実装する場合でも、この 2 つは相互に補完できます。 C プロジェクト関数では、Python が C モジュールを呼び出す必要がある場合があります。
#次は、一元化された C コードを Python インターフェイスにエクスポートするためのメソッドのリストです。 . 一緒に学びましょう。
元のエクスポート (推奨学習: Python ビデオ チュートリアル)
Python インタープリターは C で実装されているため、 C データ構造が Python で理解できる限り、理論的には直接呼び出すことができます。 test1.cpp を次のように実装します
#include <Python.h> int Add(int x, int y) { return x + y; } int Del(int x, int y) { return x - y; } PyObject* WrappAdd(PyObject* self, PyObject* args) { int x, y; if (!PyArg_ParseTuple(args, "ii", &x, &y)) { return NULL; } return Py_BuildValue("i", Add(x, y)); } PyObject* WrappDel(PyObject* self, PyObject* args) { int x, y; if (!PyArg_ParseTuple(args, "ii", &x, &y)) { return NULL; } return Py_BuildValue("i", Del(x, y)); } static PyMethodDef test_methods[] = { {"Add", WrappAdd, METH_VARARGS, "something"}, {"Del", WrappDel, METH_VARARGS, "something"}, {NULL, NULL} }; extern "C" void inittest1() { Py_InitModule("test1", test_methods); }
コンパイル コマンドは次のとおりです
g++ -fPIC -shared test1.cpp -I/usr/include/python2.7 -o test1.so
-fPIC: 動的接続に適した、位置に依存しないターゲット コードを生成します。 ;
- L パス: パス ディレクトリでライブラリ ファイルを検索することを意味します (-L など)。現在のディレクトリで検索することを意味します。
-I パス: パス ディレクトリでヘッダー ファイルを検索することを意味します。 -o file: 出力ファイルをファイルとして指定します;
-shared: 共有ライブラリ ファイルを生成します;
Python インタープリターを実行し、次のようにテストします
>>> import test1 >>> test1.Add(1,2) 3
ここで注意すべき点がいくつかあります
生成されるダイナミック ライブラリの名前が test1 の場合、ソース ファイルには inittest1 関数が含まれている必要があり、Py_InitModule の最初のパラメータは "test1" である必要があります。 ", そうしないと、Python インポート モジュールは失敗します。 cpp ソース ファイルの場合、inittest1 関数を extern "C" で変更する必要があります。c ソース ファイルの場合、これは必要ありません。その理由は、Python インタプリタはライブラリをインポートするときに initxxx などの関数を検索し、C と C では関数シンボルのエンコード方法が異なるためです。C では、関数シンボルをエンコードするときに関数の長さとパラメータの型が考慮されます。具体的には、nm test1 を渡すことができます。関数シンボルをチェックすると、c filt ツールはシンボルを通じて関数プロトタイプをデコードできます。Python 関連の技術記事の詳細については、Python チュートリアル 列にアクセスして学習してください。
以上がPython で C++ コードを使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。