DLL 関数を呼び出す Jupyter ノートブックを使用して、かなり単純なリスト操作を実行しようとしています。Jupyter ノートブック/Python コードで Python リストを C++ 関数に渡し、リストを変更してから、Python コードで新しいリスト値にアクセスできるようにしたいと考えています。
C++ コードで編集されていない項目を (Jupyter で) 実際に読み取ることができるので、書き方に問題があるはずですが、見つけることができるすべての例は、私のコードのように見えます。C++ コードが書き込むリスト内の項目にアクセスしようとすると、Jupyter カーネルが何の説明もなく停止します。端末で同じ Python コードを実行しようとしましたが、端末セッションは説明なしで終了します。
Windows 10、Python 3.9.2 の環境で実行されます。これがPythonです:
import os
import ctypes
import _ctypes
# Import the DLL
mydll = ctypes.cdll.LoadLibrary(*path to DLL*)
# Set up
data_in = [3,6,9]
mydll.testChange.argtypes = [ctypes.py_object]
mydll.testChange.restype = ctypes.c_float
mydll.testChange(data_in)
# Returns 0.08
これを実行して DLL を閉じた後、実行するとdata_in[1]
6 がdata_in[2]
返され、9 が返さdata_in[0]
れ、カーネルが停止します。
DLL の C コード:
float testChange(PyObject *data_out) {
Py_SetPythonHome(L"%user directory%\\anaconda3");
Py_Initialize();
PyList_SetItem(data_out, 0, PyLong_FromLong(1L));
return 0.08;
}
PyList_SetItem
また、このコードにいくつかの print ステートメントを挿入することもできます。これは、 using のような呼び出しの呼び出しの前後で、DLL 内の 3 つの項目すべてを読み取ることができることを示していますPyLong_AsLong(PyList_GetItem(data_out, 1))
。参照カウントを変更する必要があるかどうかはわかりませんが、おそらくその考えを誤解しています。皆さんのアイデアは大歓迎です。