[解決済み] 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 のリンクを参照してください)。
もし何か質問があれば、遠慮なく言ってください。幸運を祈ります。
関連
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Pythonの辞書からキーを削除するにはどうしたらいいですか?
-
[解決済み] モジュールの関数名(文字列)を使って、モジュールの関数を呼び出す。
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] Pythonでファイル名から拡張子を抽出する
-
[解決済み] Pythonでパスから拡張子なしでファイル名を取得する方法は?
-
[解決済み] CとC++でmain()は何を返すべきですか?
-
[解決済み】Pythonで辞書のキーをリストとして返すには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テスト
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較