0

I am trying to do some fairly simple list manipulation, using a Jupyter notebook that calls a DLL function. I'd like my Jupyter notebook/Python code to pass in a Python list to a C++ function, which modifies the list, and then I'd like the Python code to be able to access the new list values.

I can actually read (in Jupyter) the items that were not edited by the C++ code, so there must be some issue with how I'm writing, but every example I can find looks just like my code. When I try to access the item in the list that the C++ code writes, my Jupyter kernel dies with no explanation; I've tried to run the same Python code in the terminal, and the terminal session just exits, again with no explanation.

Running on Windows 10, environment with Python 3.9.2. Here's the 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

After running this and closing the DLL, running data_in[1] returns 6, data_in[2] returns 9, and data_in[0] causes my kernel to die.

C code for the DLL:

float testChange(PyObject *data_out) {
    Py_SetPythonHome(L"%user directory%\\anaconda3");
    Py_Initialize();

    PyList_SetItem(data_out, 0, PyLong_FromLong(1L));

    return 0.08;
}

I can also insert a number of print statements in this code that show that I can read out all three items in the DLL both before and after the call to PyList_SetItem using calls like PyLong_AsLong(PyList_GetItem(data_out, 1)). It's not clear to me that any reference counts need changing or anything like that, but perhaps I misunderstand the idea. Any ideas you all have would be greatly appreciated.

  • Calling `Py_SetPythonHome` and especially `Py_Initialize` in a python dll export seems wrong. Can you try without them? – Daniel May 17 '21 at 19:03
  • @Dani I unfortunately have to do these to get anything at all to work; the interpreter doesn't find my Python installation if I don't. I agree that it seems wrong just based on what I was seeing elsewhere online, but I don't know enough to be able to figure all this out. – flevinBombastus May 17 '21 at 19:16

0 Answers0