Я реализовал модуль взаимодействия Python - C, используя ctypes
. Ниже приведены соответствующие фрагменты:
# PQACORE_API void* PqaEngine_Compact(void *pvEngine, int64_t *pnQuestions, int64_t const ** const ppOldQuestions,
# int64_t *pnTargets, int64_t const ** const ppOldTargets);
pqa_core.PqaEngine_Compact.restype = ctypes.c_void_p
pqa_core.PqaEngine_Compact.argtypes = (ctypes.c_void_p,
ctypes.POINTER(ctypes.c_int64), ctypes.POINTER(ctypes.POINTER(ctypes.c_int64)),
ctypes.POINTER(ctypes.c_int64), ctypes.POINTER(ctypes.POINTER(ctypes.c_int64)))
Тем не менее, я получаю исключение в следующем коде, строка 707 помечена:
def compact(self) -> Tuple[List[int], List[int]]:
n_questions = ctypes.c_int64()
n_targets = ctypes.c_int64()
p_questions = ctypes.POINTER(ctypes.c_int64)()
p_targets = ctypes.POINTER(ctypes.c_int64)()
c_err = ctypes.c_void_p()
c_err.value = pqa_core.PqaEngine_Compact(self.c_engine, ctypes.byref(n_questions), ctypes.byref(p_questions),
ctypes.byref(n_targets), ctypes.byref(p_targets)) # line 707
Исключение говорит следующее:
Traceback (most recent call last):
File "D:\Servers\Web\Django\probqa.com-site\src\PqaWeb\pqawV1\admin_actions.py", line 146, in use_existing_engine
self.engine.compact()
File "D:\Servers\Web\Django\probqa.com-site\src\PqaWeb\ProbQAInterop\ProbQA.py", line 707, in compact
ctypes.byref(n_targets), ctypes.byref(p_targets))
ctypes.ArgumentError: argument 3: <class 'TypeError'>: expected LP_LP_c_longlong instance instead of pointer to LP_c_longlong
Исключение выдается при запуске программы под Apache / 2.4.37 (Win64).
Код на C / C ++ правильный. Это код Python, который необходимо исправить, чтобы он соответствовал API C.
Можете ли вы помочь мне решить проблему?