1. ホーム
  2. c++

[解決済み] C/C++からpythonのメソッドを呼び出し、その戻り値を抽出する。

2023-06-10 14:43:43

質問

Pythonモジュールで定義されたカスタム関数をC言語から呼び出したいのですが、そのための予備的なコードはありますが、標準出力に出力されるだけです。

mytest.py

import math

def myabs(x):
    return math.fabs(x)

test.cpp

#include <Python.h>

int main() {
    Py_Initialize();
    PyRun_SimpleString("import sys; sys.path.append('.')");
    PyRun_SimpleString("import mytest;");
    PyRun_SimpleString("print mytest.myabs(2.0)");
    Py_Finalize();

    return 0;
}

返り値をC言語の double に取り出し、C言語で使用するにはどうしたらよいでしょうか?

どのように解決するのですか?

前に説明したように、PyRun_SimpleStringを使うのは良くないようです。

C-APIで提供されているメソッドを使うべきです( http://docs.python.org/c-api/ ).

イントロダクションを読むことは、その仕組みを理解するために最初にすべきことです。

まず、C API の基本オブジェクトである PyObject について学ぶ必要があります。PyObjectはPythonの基本型(string, float, int,...)を表現することができます。

Pythonの文字列をchar*に、PyFloatをdoubleに変換する多くの関数が存在します。

まず、モジュールをインポートします。

PyObject* myModuleString = PyString_FromString((char*)"mytest");
PyObject* myModule = PyImport_Import(myModuleString);

次に、関数への参照を取得します。

PyObject* myFunction = PyObject_GetAttrString(myModule,(char*)"myabs");
PyObject* args = PyTuple_Pack(1,PyFloat_FromDouble(2.0));

そして、結果を取得します。

PyObject* myResult = PyObject_CallObject(myFunction, args)

そして、ダブルに戻ると:

double result = PyFloat_AsDouble(myResult);

当然ながら、エラーをチェックする必要があります (Mark Tolonen のリンクを参照してください)。

もし何か質問があれば、遠慮なく言ってください。幸運を祈ります。