C/C++ への Python の埋め込みも比較的簡単です。まず、Python のインクルード ファイル ディレクトリと lib ファイル ディレクトリを VC に追加する必要があります。
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 'hi, python!'"); Py_Finalize(); return 0; }
Py_Initialize 関数のプロトタイプは次のとおりです: void
Py_Initialize()、この関数は Python スクリプトを埋め込むときに使用する必要があり、Python インタープリターを初期化し、他の Python/C を使用するときに使用されます。
この関数は API の前に呼び出す必要があります。 Py_IsInitialized 関数を使用すると、初期化が成功したかどうかを判断し、成功した場合は True を返すことができます。
PyRun_SimpleString 関数のプロトタイプは int です
PyRun_SimpleString(const char
*command)、Python コードの一部を実行するために使用されます。注: ステートメント間でインデントを維持する必要がありますか?
Py_Finalize 関数のプロトタイプが無効です
Py_Finalize()。Python インタープリターを閉じ、インタープリターによって占有されていたリソースを解放するために使用されます。
PyRun_SimpleFile 関数は、「.py」スクリプト ファイルを実行するために使用できます。関数のプロトタイプは次のとおりです:
int
PyRun_SimpleFile(FILE *fp, const char *ファイル名);
その
ここで、 fp は開いているファイル ポインタ、 filename は実行する Python スクリプト ファイルの名前です。ただし、この機能は Visual Studio が正式にリリースした機能なので、
2003.NET でコンパイルすると、他のバージョンのコンパイラを使用すると、バージョンの理由により FILE 定義でクラッシュが発生する可能性があります。同時に、簡単にするために、次のメソッドを使用してこの関数を置き換えることができます:
PyRun_SimpleString("execfile(‘file.py’)");
//execfile を使用して Python ファイルを実行します
Py_BuildValue() は、数値と文字列を Python の対応するデータ型に変換するために使用されます (C 言語では、Python のすべての型は PyObject 型として宣言されます)。関数のプロトタイプは次のとおりです:
PyObject
*Py_BuildValue(const char *format,
…..);
PyString_String() は、PyObject* 型の変数を C 言語で処理できる char* 型に変換するために使用されます。具体的なプロトタイプは次のとおりです。
PyString_String(PyObject *p);
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);
int PyList_Reverse(PyObject
*list);
Py_ssize_t PyList_Size(PyObject *list);
int
PyTuple_New(Py_ssize_t len);
int PyTuple_SetItem(PyObject *p, Py_ssize_t pos,
PyObject *o);
PyObject * PyTuple_GetItem(PyObject *p, Py_ssize_t pos);
int
_PyTuple_Resize(PyObject **p, Py_ssize_t newsize);
//** ポインターであることに注意してください
辞書操作関数:
PyObject * PyDict_New();
int PyDict_SetItem(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 関数の場合、パラメーターは NULL ポインターにすることができ、これは操作が実行されないことを意味しますが、Py_DECREF 関数は NULL ポインターにすることができず、それ以外の場合はエラーが発生します。
PyImport_Import() 関数を使用して、Python モジュールを C にインポートし、モジュール オブジェクトを返します。関数のプロトタイプは次のとおりです:
PyObject*
PyImport_Import(PyObject
*name);
PyModule_GetDict() 関数は、Python モジュール内の関数リストを取得し、辞書を返すことができます。辞書内のキーは関数名で、値は関数の呼び出しアドレスです。プロトタイプは次のとおりです:
PyObject*
PyModule_GetDict(PyObject
*module);
PyObject_CallObject() 関数と PyObject_CallFunction() 関数を使用して、C から Python の関数を呼び出します。プロトタイプは次のとおりです:
PyObject*
PyObject_CallObject(PyObject *callable_object, PyObject
*args);
//args はタプル形式です
PyObject* PyObject_CallFunction(PyObject *callable,
char *形式、
...);
//format は、「iss」に似たパラメータ型で、その後に指定されたパラメータが続きます
PyCallable_Check(func) を使用して関数を呼び出すことができるかどうかを判断し、呼び出すことができる場合は True を返すことができます。
上記は C/C++ への Python の埋め込みに関する内容です。その他の関連記事については、PHP 中国語 Web サイト (www.php.cn) に注目してください。