Ожидаемый экземпляр LP_LP_c_longlong вместо указателя на LP_c_longlong - PullRequest
0 голосов
/ 19 марта 2020

Я реализовал модуль взаимодействия 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.

Можете ли вы помочь мне решить проблему?

...