Я пишу оболочку Python для программы C. Намерение состоит в том, чтобы установить набор глобальных переменных в Python, передать их в C через CFFI (код C использует много глобальных переменных), изменить эти глобальные переменные в коде C и затем подобрать результаты в коде Python для дальнейшей обработки.
Примеры того, как я устанавливаю массив данных и строковую переменную для передачи на стороне Python в функции оболочки:
import numpy as np
import ctypes
myarray = np.zeros((100), dtype=np.float64)
p_myarray = myarray.ctypes.data
lib.myarray = ffi.cast("double *", p_myarray)
sd = {} # Dictionary to try to save the variables in memory
mystring = 'Dragonfruit'.encode('ascii')
lib.mystring = sd[mystring] = ffi.new("char[20]", mystring)
lib.test() # Call to C code
print(sd) # Try to force Python to keep the strings allocated until this point at least
И сборка CFFI:
...
ffibuilder.cdef("""
extern double *myarray;
extern char *mystring;
int test(void);
Есть две проблемы, возможно связанные:
Код C большой, он выдает и записывает в локальных массивах. В некоторых случаях строки, переданные с Python, перезаписываются. Добавление их в словарь Python и использование его после кода C, по-видимому, делает их более стабильными (т. Е. Они превращают его в код C в порядке, но не всегда из него).
Если мне повезет и я получу его достаточно стабильным, чтобы вернуться к коду Python без дампа памяти из-за перезаписи моих переменных, я получу
Python: free(): invalid next size (fast)
ошибка, которая из других постов здесь, кажется, означает, что некоторая память пытается освободиться, которая уже была освобождена.
Я подозреваю, что Python освобождает мои переменные слишком рано (т.е. до C код), кто-нибудь знает, как это предотвратить?