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コード
    return [mfcc_featMean.tolist(),mfcc_featStd.tolist(),mfcc_featEntropy.tolist(),timeLast]
  • C++コード
    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);
    		}
  • は3について、資料を調べて一般的にimportを繰り返すことができないことを知っています.そうしないと、前回のimportのcacheを読みます.時間の問題も深く研究していないで、直接クラス内で3つのPyObject*メンバー変数を定義して、それからクラスの構造関数で
    //python   
    	Py_Initialize();
    	pModule = PyImport_ImportModule("qtHelper");
    	pFunc1 = PyObject_GetAttrString(pModule, "getMfccAndRes");
    	pFunc2 = PyObject_GetAttrString(pModule, "getClassificationRes");
    を初期化して、このクラス内でこのmoduleとfuncを繰り返し使用することができます.
  • は4について2つのケースに分けられます.1つは、dllまたは関連ファイルが一般的に欠けていることを示すエラーです.二、クリックして反応しません:テスト機はpython環境と呼び出すライブラリをインストールする必要があります.shellを使ってpyファイルが実行できるかどうかをテストします.

  • リファレンスリンク
    List Object python公式ドキュメント
    C++とPython通信--知っています
    c++呼び出しpythonスクリプトで遭遇したピット