Возможно, вам лучше с конфигурацией, которая предоставляет сервисный компонент в зависимости от результата вашего запроса?
@Configuration
public class ServiceProvider {
@Autowired private SystemSettingRepository settingsRepo;
@Bean
public MyInterface myIneterface(){
boolean cmis = settingsRepo.useCMIS() ;
if(cmis){
return xMyService();
} else {
return yMyService();
}
}
private XMyService xMyService(){
return new XMyService();
}
private YMyService yMyService(){
return new YMyService();
}
}
Хорошо, благодаря вам, все готово, все, что мне нужно было сделать, это изменить файл .pyx следующим образом:
cimport c_test
import numpy as np
cimport numpy as np
from libc.stdlib cimport free
np.import_array()
ctypedef void (*PyCapsule_Destructor)(void*)
cdef extern from "numpy/arrayobject.h":
void* PyCapsule_GetPointer(void* capsule, const char *name)
void* PyCapsule_New(void *pointer, const char *name, PyCapsule_Destructor destructor)
int PyArray_SetBaseObject(np.ndarray arr, void* obj)
cdef void capsule_cleanup(void* capsule):
cdef void *memory = PyCapsule_GetPointer(capsule, NULL)
free(memory)
def test(n):
cdef np.ndarray arr
cdef int nd = 1
cdef np.npy_intp shape[1]
shape[0] = <np.npy_intp> n
cdef double *data = c_test.test1(n)
arr = np.PyArray_SimpleNewFromData(nd, shape, np.NPY_DOUBLE, data)
cdef void* capsule = PyCapsule_New(data, NULL, capsule_cleanup)
PyArray_SetBaseObject( arr, capsule)
return(arr)
Как объясняется в проблеме Github , которую вы связали, NPY_OWNDATA
безопасно использовать только с памятью, выделенной через тот же распределитель, который использует сама NumPy. К этому распределителю можно получить доступ через функции PyDataMem_*
. Если ваша память не исходит от этого распределителя, вы не можете использовать NPY_OWNDATA
.
Не пытайтесь заставить массив принять владение произвольной памятью, которую вы ему даете. Вместо этого установите base массива для объекта, который знает, как выполнить правильную очистку, используя PyArray_SetBaseObject
. Капсула может быть удобным объектом для использования.