ホームページ >php教程 >PHP开发 >C/C++ への Python の埋め込み

C/C++ への Python の埋め込み

高洛峰
高洛峰オリジナル
2016-11-23 13:47:471584ブラウズ

C/C++ への Python の埋め込みも比較的簡単です。まず、VC に Python のインクルード ファイル ディレクトリと lib ファイル ディレクトリを追加する必要があります。
VC6.0 では、[ツール]->[オプション]->[ディレクトリ]->[ディレクトリを表示]を開きます。の場合、Python インストール ディレクトリの inlude ディレクトリをインクルード ファイル項目に追加し、libs ディレクトリをライブラリ ファイル項目に追加します。
VC2005 で、[ツール] -> [オプション] -> [プロジェクトとソリューション] -> [VC++] ディレクトリを開き、同じ作業を行います。

コードは次のとおりです:

//在debug下执行出错,“无法找到python31_d.lib文件”,后查到原因是:在debug下生成必须要有python31_d.lib文件,否则只能在release下生成
#include <python.h>
int main()
{
    Py_Initialize();
    PyRun_SimpleString("Print &#39;hi, python!&#39;");
    Py_Finalize();
    return 0;
}

Py_Initialize 関数のプロトタイプは次のとおりです: void Py_Initialize()。この関数は、Python スクリプトを埋め込むときに使用する必要があります。この関数は、他の Python を使用する前に呼び出す必要があります。 /C API。 Py_IsInitialized 関数を使用すると、初期化が成功したかどうかを判断し、成功した場合は True を返すことができます。
PyRun_SimpleString 関数のプロトタイプは int PyRun_SimpleString(const char *command) で、Python コードの一部を実行するために使用されます。注: ステートメント間のインデントを維持する必要がありますか?
Py_Finalize 関数のプロトタイプは void Py_Finalize() で、これは Python インタープリターを閉じ、インタープリターによって占有されているリソースを解放するために使用されます。

PyRun_SimpleFile 関数は、「.py」スクリプト ファイルを実行するために使用できます。関数のプロトタイプは次のとおりです:
int PyRun_SimpleFile(FILE *fp, const char *filename);
ここで、fp は開いているファイル ポインター、ファイル名は実行するPythonスクリプトファイル名。ただし、この関数の正式リリースは Visual Studio 2003.NET でコンパイルされているため、他のバージョンのコンパイラを使用すると、バージョンの理由で FILE 定義がクラッシュする可能性があります。同時に、簡単のために、次のメソッドを使用してこの関数を置き換えることもできます:
PyRun_SimpleString("execfile('file.py')"); Python での対応するデータ型への変換処理 (C 言語の場合) 、すべての Python 型は PyObject 型として宣言されます)、関数プロトタイプは次のとおりです:
PyObject *Py_BuildValue(const char *format, …..);
PyString_String( ) は、PyObject* 型変数を char* 型に変換するために使用されます。具体的なプロトタイプは以下の通りです:
char* PyString_String(PyObject *p);

List 操作関数:

PyObject * PyList_New(Py_ssize_t len);

int PyList_SetItem(PyObject *list, Py_ssize_t index, PyObject *item);
PyObject * PyList_GetItem(PyObject *list, Py_ssize_t Index);
int PyList_Append(PyObject *list, PyObject *item);
int PyList_Sort(PyObject *list);
py_ssize_t pylist_size (pyobject *list); item (pyobject *p, py_ssize_t pos, pyobject *o);
int _PyTuple_Resize(PyObject **p, Py_ssize_t newsize); ** ポインターです

Dictionary 操作関数:

PyObject * PyDict_New();

int PyDict_SetIt em(PyObject *p, PyObject *key, PyObject *val);
int PyDict_SetItemString(PyObject *p, const char *key, PyObject *val);
PyObject* PyDict_GetItem(PyObject *p, PyObject *key);
PyObject* PyDict_GetItemString(PyObject *p, const char *key)
//PyDict_SetItemString

int PyDict_DelItem(PyObject *p, PyObject *)に対応しますkey);

int PyDict_DelItemString(PyObject *p, char *key);
//PyDict_SetItemString に対応
int PyDict_Next (PyObject *p, Py_ssize_t *ppos, PyObject **pkey, PyObject **pvalue);
PyObject* PyDict_Items( PyObject *p);
PyObject* PyDict_keys(PyObject *p);
PyObject* PyDict_Values(PyObject *p);

C/C++ で Python オブジェクトを使用する場合、参照カウントの問題は正しく処理される必要があります。そうしないと、簡単に問題が発生する可能性があります。メモリリーク。 Python/C API の関数を使用してリスト、タプル、辞書などを作成する場合、Py_CLEAR() や Py_DECREF() などのマクロを使用して、オブジェクトに対する操作が完了した後にこれらのオブジェクトを破棄する必要があります。プロトタイプは次のとおりです:
void Py_CLEAR(PyObject *o);
void Py_DECREF(PyObject *o);
このうち、Py_CLEAR 関数の場合、パラメーターは何も実行されないことを意味しますが、 Py_DECREF 関数を NULL ポインターにすることはできません。そうしないと、間違いが発生します。

PyImport_Import() 関数を使用して、Python モジュールを C にインポートし、モジュール オブジェクトを返します。関数のプロトタイプは次のとおりです:
PyObject* PyImport_Import(PyObject *name);
PyModule_GetDict() 関数は、Python モジュール内の関数リストを取得し、辞書を返します。辞書のキーは関数名で、値は呼び出しアドレスです。機能の。プロトタイプは次のとおりです:
PyObject* PyModule_GetDict(PyObject *module);
C で Python の関数を呼び出すには、PyObject_CallObject() 関数と PyObject_CallFunction() 関数を使用します。プロトタイプは次のとおりです:
PyObject* PyObject_CallObject(PyObject *callable_object) , PyObject *args) ;
//args はタプル形式です
PyObject* PyObject_CallFunction(PyObject *callable, char *format, ...);
//format は "iss" に似たパラメータ型で、その後に指定されたパラメータが続きます
PyCallable_Check(func ) を使用して関数を呼び出すことができるかどうかを判断し、呼び出すことができる場合は True を返します。



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。