スポンサーリンク

Windows + VC++ + Python/C APIでPythonからCを呼び出す(3)Cから値を返す

mymod.h

#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

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

test.py

import DLLforPython

print( DLLforPython.get_int() )

print( DLLforPython.get_bool() )

print( DLLforPython.get_float() )

print( DLLforPython.get_string() )
100
False
3.5
test

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: