Qt呼び出しPython関数
2067 ワード
ターゲット
Qt呼び出しPython関数
プロセス
Pythonの下位層はC++で記述され,両者間の相互呼び出しは一般的な動作である.呼び出しは基本的にextensionとembeddingの2種類に分けられ、前者はPythonプログラムが実行速度を高めるためにCの拡張モジュールに加入し、後者はCプログラムがPython関数を呼び出して豊富なライブラリ関数と簡潔なコード(別の言い方では手間が省ける)を利用する方法で、2つの方法は公式サイトで詳しく紹介されており、具体的な呼び出し過程は以下のブログを参照することができる.この文書では、numpyとreleaseを呼び出してテストマシンで発生した問題を主に記録します.
に質問 DebugモードでPyImort_ImportModule()はnullを返し、releaseは正常 です. PyParse_Turple()はNULL を返す PyImport_ImportModule 2回目の運転は に戻る releaseは、テストマシン上で実行できないものがあります.
解決策は、1/2、特にpythonファイルがpython組み込みタイプではなくnumpyのようなタイプを返す場合によく発生します.一般的にpythonファイルのパスの問題でimportができません.vsを使用する場合は、コンパイルプロセスが必要なpyファイルを含むかどうかを出力バーで確認できます.私はしばらくもがいた後、PyObjectArrayと死闘しないことにし、numpy配列を迂回し、python関数が戻る前にndarrayをtoList()を介してlist配列に変換し、Qtの端でPyList_を使用することにした.GetItem()は要素を取得します.呼び出したpythonスクリプトや関数は、コマンドラインでpythonを直接使用して実行できるものでなければなりません.pycharmのようなIDEでは計算されません. Pythonコード C++コード は3について、資料を調べて一般的にimportを繰り返すことができないことを知っています.そうしないと、前回のimportのcacheを読みます.時間の問題も深く研究していないで、直接クラス内で3つのPyObject*メンバー変数を定義して、それからクラスの構造関数で は4について2つのケースに分けられます.1つは、dllまたは関連ファイルが一般的に欠けていることを示すエラーです.二、クリックして反応しません:テスト機はpython環境と呼び出すライブラリをインストールする必要があります.shellを使ってpyファイルが実行できるかどうかをテストします.
リファレンスリンク
List Object python公式ドキュメント
C++とPython通信--知っています
c++呼び出しpythonスクリプトで遭遇したピット
Qt呼び出しPython関数
プロセス
Pythonの下位層はC++で記述され,両者間の相互呼び出しは一般的な動作である.呼び出しは基本的にextensionとembeddingの2種類に分けられ、前者はPythonプログラムが実行速度を高めるためにCの拡張モジュールに加入し、後者はCプログラムがPython関数を呼び出して豊富なライブラリ関数と簡潔なコード(別の言い方では手間が省ける)を利用する方法で、2つの方法は公式サイトで詳しく紹介されており、具体的な呼び出し過程は以下のブログを参照することができる.この文書では、numpyとreleaseを呼び出してテストマシンで発生した問題を主に記録します.
に質問
解決策
return [mfcc_featMean.tolist(),mfcc_featStd.tolist(),mfcc_featEntropy.tolist(),timeLast]
frameNums = PyList_Size(PyList_GetItem(pReturn, 0));
PyArg_Parse(PyList_GetItem(pReturn, 3), "d", &timeLast);
double tmp;
for (int i = 0; i < frameNums; i++)
{
PyArg_Parse(PyList_GetItem(PyList_GetItem(pReturn, 0), i), "d", &tmp);
mfcc_featMean.append(tmp);
}
//python
Py_Initialize();
pModule = PyImport_ImportModule("qtHelper");
pFunc1 = PyObject_GetAttrString(pModule, "getMfccAndRes");
pFunc2 = PyObject_GetAttrString(pModule, "getClassificationRes");
を初期化して、このクラス内でこのmoduleとfuncを繰り返し使用することができます.リファレンスリンク
List Object python公式ドキュメント
C++とPython通信--知っています
c++呼び出しpythonスクリプトで遭遇したピット