Неподписанный короткий * аргумент, вызываемый по ссылке — альтернатива в python для кода Cython

Я новичок в 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, как и другие изменяемые объекты, передаются «по ссылке». Вы вызываете somefunc(array1, array2), и как array1, так и array2 всегда могут быть изменены somefunc. Я не уверен, что здесь существует реальная проблема, которую необходимо решить.

Charles Duffy 14.12.2020 17:48

(Если вы спрашиваете не о том, как написать это на Python, а о том, как написать это на Cython, то для этого требуется указатель на документацию MemoryView).

Charles Duffy 14.12.2020 17:58

... тем не менее, Cython MemoryView похож на любой другой изменяемый объект в Python - он всегда передается по ссылке.

Charles Duffy 14.12.2020 18:10

Спасибо, Чарльз, это ответило на большую часть моего вопроса. Спасибо, что выдержали мою новизну. Последняя часть для меня — как определить беззнаковый короткий тип. Я изменил вопрос, чтобы включить более подробную информацию. Я попробовал наивные шаги, которые привели к некоторой ошибке (включенной в отредактированный ответ)

Hope 14.12.2020 19:40

Спасибо - редактирование с включением этих деталей имеет большое значение для того, чтобы на этот вопрос можно было ответить; Я отозвал свой закрытый голос. Надеюсь, кто-то с большим опытом работы с Cython сможет вмешаться — прошло много лет с тех пор, как я использовал его в последний раз, и я забыл большую часть того, что когда-то знал.

Charles Duffy 14.12.2020 20:04
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
86
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я решил проблему, перейдя с Cython на SWIG. SWIG создал «оболочку c для python» в Debian простым способом и определил все типы данных без каких-либо ошибок.

Я до сих пор не знаю, как решить эту проблему для Cython. Но в моем случае SWIG справился со своей задачей.

Другие вопросы по теме