C/C++にPythonを埋め込む

4022 ワード



C/C++にPythonを埋め込むのも簡単ですが、まずVCにPythonのincludeファイルディレクトリとlibファイルディレクトリを追加する必要があります.
VC6.0でtools->options->directories->show directories forを開き、Pythonインストールディレクトリのinludeディレクトリをinlude filesアイテムに追加し、libsディレクトリをlibrary filesアイテムに追加します.
VC 2005では、tools->options->プロジェクトとソリューション->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関数のプロトタイプはvoid Py_Finalize()は、Pythonインタプリタを閉じ、インタプリタが占有するリソースを解放するために使用されます.PyRun_SimpleFile関数は、.pyスクリプトファイルを実行するために使用できます.関数のプロトタイプは、int PyRun_です.SimpleFile(FILE *fp, const char *filename);ここで、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*タイプに変換するために使用され、具体的なプロトタイプは以下の通りである: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()関数は、CにPythonモジュールをインポートし、モジュールオブジェクトを返すことができます.関数のプロトタイプ:
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, ……);
//formatは「iss」のようなパラメータタイプで、後で指定したパラメータです
PyCallable_を使用できますCheck(func)は関数を呼び出すことができるかどうかを判断し,できればTrueを返す.