スポンサーリンク
#pragma once #include <Python.h> // libファイルが必要 // anaconda3\Include にPython.hがある時、おそらく // anaconda3\libs にある。 #pragma comment (lib,"python39.lib")
// C++側の関数宣言 __declspec(dllexport) extern "C" PyObject * get_int_in_c(PyObject*); __declspec(dllexport) extern "C" PyObject * get_bool_in_c(PyObject*); __declspec(dllexport) extern "C" PyObject * get_float_in_c(PyObject*); __declspec(dllexport) extern "C" PyObject * get_string_in_c(PyObject*);
// 関数へアクセスする方法一覧 static PyMethodDef method_list[] = { // Pythonで使用する関数名 , C++内で使用する関数名 , 引数の個数に関するフラグ , docstring { "get_int", (PyCFunction)get_int_in_c, METH_VARARGS , nullptr }, { "get_bool", (PyCFunction)get_bool_in_c, METH_VARARGS , nullptr }, { "get_float", (PyCFunction)get_float_in_c, METH_VARARGS , nullptr }, { "get_string", (PyCFunction)get_string_in_c, METH_VARARGS , nullptr }, // 配列の最後は全てNULLの要素を入れておく { nullptr, nullptr, 0, nullptr } };
// モジュールを定義する構造体 static PyModuleDef module_def = { PyModuleDef_HEAD_INIT, "DLLforPython", // モジュール名 "Example of pyhton wrapper", // モジュール説明 0, method_list // Structure that defines the methods of the module }; PyMODINIT_FUNC PyInit_DLLforPython() { return PyModule_Create(&module_def); }
// mymod.cpp #include "mymod.hpp"
// intを返す PyObject* get_int_in_c(PyObject*) { PyObject* obj = PyLong_FromLong(100); return obj; }
// boolを返す PyObject* get_bool_in_c(PyObject*) { PyObject* obj = PyBool_FromLong((long)false); return obj; }
// floatを返す PyObject * get_float_in_c(PyObject*) { PyObject* obj = PyFloat_FromDouble(3.5); return obj; }
// stringを返す PyObject * get_string_in_c(PyObject*) { PyObject* obj = PyUnicode_FromFormat("test"); return obj; }
import DLLforPython print( DLLforPython.get_int() ) print( DLLforPython.get_bool() ) print( DLLforPython.get_float() ) print( DLLforPython.get_string() )