Я новичок в Python. В настоящее время я пишу оболочки python для некоторого кода c, используя Cython.
Заголовок функции c:
FunctionName (unsigned short *inputData, unsigned short *outputData)
inputData/outputData — это массивы беззнаковых шорт, вызываемые по ссылке в функции.
Я попробовал следующую оболочку:
test.py
cdef extern from "Header.h":
void FunctionName (unsigned short *inputData, unsigned short *outputData)
def py_FunctionName(inputData, outputData)-> None :
FunctionName (inputData, outputData)
Я получаю следующую ошибку при запуске make:
inputData,
^
Cannot convert Python object to 'unsigned short *'
outputData,
^
Cannot convert Python object to 'unsigned short *'
Я пробовал тот же код с (unsigned char *) и другими, и он хорошо скомпилировался.
Я хотел бы знать лучший способ решить эту проблему. то есть: написание аргументов функции python, которые являются указателями на массивы типа (эквивалентного) unsigned short и могут быть изменены внутри кода, аналогичного «по ссылке» в C?
И если это невозможно сделать напрямую, каковы допустимые решения в python? В настоящее время я использую Python 3.8
Спасибо.
(Если вы спрашиваете не о том, как написать это на Python, а о том, как написать это на Cython, то для этого требуется указатель на документацию MemoryView).
... тем не менее, Cython MemoryView похож на любой другой изменяемый объект в Python - он всегда передается по ссылке.
Спасибо, Чарльз, это ответило на большую часть моего вопроса. Спасибо, что выдержали мою новизну. Последняя часть для меня — как определить беззнаковый короткий тип. Я изменил вопрос, чтобы включить более подробную информацию. Я попробовал наивные шаги, которые привели к некоторой ошибке (включенной в отредактированный ответ)
Спасибо - редактирование с включением этих деталей имеет большое значение для того, чтобы на этот вопрос можно было ответить; Я отозвал свой закрытый голос. Надеюсь, кто-то с большим опытом работы с Cython сможет вмешаться — прошло много лет с тех пор, как я использовал его в последний раз, и я забыл большую часть того, что когда-то знал.
Я решил проблему, перейдя с Cython на SWIG. SWIG создал «оболочку c для python» в Debian простым способом и определил все типы данных без каких-либо ошибок.
Я до сих пор не знаю, как решить эту проблему для Cython. Но в моем случае SWIG справился со своей задачей.
Все массивы и списки Python, как и другие изменяемые объекты, передаются «по ссылке». Вы вызываете
somefunc(array1, array2)
, и как array1, так и array2 всегда могут быть изменены somefunc. Я не уверен, что здесь существует реальная проблема, которую необходимо решить.