#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;
}