スポンサーリンク

Windows + VC++ + Python/C APIでPythonからCを呼び出す(6)PythonのリストをC++へ渡す

Python側からリストを渡したときの受け取り方。

mymod.cpp

// mymod.cpp

#include "mymod.hpp"

void print_int(PyObject* p);
void print_float(PyObject* p);
void print_string(PyObject* p);


PyObject* list_in_c(PyObject*, PyObject* args) {

  // 受け取ったリストの内容をlistargsへ入れる
  PyObject* listargs;
  if (!PyArg_ParseTuple(args, "O!", &PyList_Type, &listargs))
    return NULL;

  // リストの要素数を取得
  int count = PyList_Size(listargs);
  printf("list item count == %d\n", count);

  // リストのアイテムを取得
  PyObject* val_0 = PyList_GetItem(listargs, 0);
  PyObject* val_1 = PyList_GetItem(listargs, 1);
  PyObject* val_2 = PyList_GetItem(listargs, 2);

  //各要素の型は、PyObject*を _Check 関数にかけて型チェックを行う

  //////////////////////////////
  if ((bool)PyLong_Check(val_0) == true) { 
    print_int(val_0); 
  }
  else if ((bool)PyFloat_Check(val_0) == true) {
    print_float(val_0);

  }
  else if ((bool)PyUnicode_Check(val_0) == true) {
    print_string(val_0);
  }
  //////////////////////////////
  if ((bool)PyLong_Check(val_1) == true) {
    print_int(val_1);
  }
  else if ((bool)PyFloat_Check(val_1) == true) {
    print_float(val_1);

  }
  else if ((bool)PyUnicode_Check(val_1) == true) {
    print_string(val_1);
  }
  //////////////////////////////
  if ((bool)PyLong_Check(val_2) == true) {
    print_int(val_2);
  }
  else if ((bool)PyFloat_Check(val_2) == true) {
    print_float(val_2);

  }
  else if ((bool)PyUnicode_Check(val_2) == true) {
    print_string(val_2);
  }


}

void print_int(PyObject* p) {
  long v = PyLong_AsLong(p);
  printf("%d\n", v);
}
void print_float(PyObject* p) {
  float v = PyFloat_AsDouble(p);
  printf("%lf\n", v);
}
void print_string(PyObject* p) {
  const char* v = PyUnicode_AsUTF8(p);
  printf("%s\n", v);
}

mymod.hpp 抜粋

__declspec(dllexport) extern "C" PyObject * list_in_c(PyObject*, PyObject*);

// 関数へアクセスする方法一覧
static PyMethodDef method_list[] = {
    // Pythonで使用する関数名 , C++内で使用する関数名 , 引数の個数に関するフラグ , docstring
    { "list_function", (PyCFunction)list_in_c, METH_VARARGS , nullptr },

    // 配列の最後は全てNULLの要素を入れておく
    { nullptr, nullptr, 0, nullptr }
};

Pythonスクリプト

import DLLforPython

DLLforPython.list_function([22,"abc",12.3])

実行結果

list item count == 3
22
abc
12.300000

コメントを残す

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

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


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