###前提・実現したいこと
Python C APIを使用して、Pythonで書かれたプログラムを実行するアプリケーションを作っています。
呼び出し側は、C++/CLI(Visual Studio2013)コンソールアプリケーションで、
Python側はPython3.6でNumpyをインポートしています。
本来はC#で作ったウィンドウから、C++/CLIで作ったDLL(Python C APIでPythonファイルを実行)経由で、Pythonファイを実行するシステムを作るのが目標です。
###発生している問題・エラーメッセージ
現状、1回実行すると正常に動作します。
問題は、1回目の処理後、アプリケーションを終了せずに、2回目を実行(for文でループさせています)すると、エラーが発生します。
Pythonファイル側でNumpyをインポートしているのですが、試しにコメントアウト(関連する処理も含めて)すると、エラーは出ずに正常動作します。
Numpyのインポートを有効にすると下記ソースコードの2回目のループ(i=1)のPyImport_Import()部分で下記のエラーメッセージが発生します。
この問題の回避策などご教授頂けないでしょうか。
よろしくお願いします。
エラーメッセージ 型 'System.AccessViolationException' のハンドルされていない例外が ConsoleApplication1.exe で発生しました 追加情報: 保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。
###該当のソースコード
------------------------------------------------------------------ 呼び出し側 C++/CLI コンソールアプリケーション #include "stdafx.h" #include <Python.h> using namespace System; int main(array<System::String ^> ^args) { PyObject *pName, *pModule, *pFunc, *pValue; for (int i = 0; i < 2; i++) { Py_Initialize(); pName = PyUnicode_DecodeFSDefault("test3"); pModule = PyImport_Import(pName); //2回目(i = 1)の処理で、ここで上記のエラーになります Py_DECREF(pName); if (pModule != NULL) { pFunc = PyObject_GetAttrString(pModule, "func"); /* pFunc is a new reference */ if (pFunc && PyCallable_Check(pFunc)) { pValue = PyObject_CallObject(pFunc, NULL); if (pValue != NULL) { printf("ret: %ld\n", PyLong_AsLong(pValue)); Py_DECREF(pValue); } else { Py_DECREF(pFunc); Py_DECREF(pModule); return 1; } } Py_XDECREF(pFunc); Py_DECREF(pModule); } Py_Finalize(); } return 0; } ------------------------------------------------------------------ Pythonファイル test3.py import numpy as np def func(): arr = np.array([1.0, 3.0, 5.0]) print (arr) return 1
###試したこと
###補足情報(言語/FW/ツール等のバージョンなど)

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/03/06 10:04