Подтвердить что ты не робот

Различия в ctypes между Python 2 и 3

У меня есть рабочая программа python 2.7, которая вызывает DLL. Я пытаюсь перенести script на python 3.2. Кажется, что вызов DLL работает (т.е. Нет ошибки при вызове), но возвращаемые данные не имеют смысла.

На всякий случай это может быть полезно: - Звонок принимает три аргумента: два int (ввод) и указатель на массив ushort (вывод).

Я пробовал использовать массивы python и numpy без успеха.

Может ли кто-нибудь перечислить различия между Python 2.7 и 3.2 в отношении ctypes?

Заранее спасибо

ИЗМЕНИТЬ

Вот пример кода. DLL является проприетарным, поэтому у меня нет кода. Но у меня есть заголовок C:

void example (int width, int height, unsigned short* pointer)

Код python:

width, height = 40, 100
imagearray = np.zeros((width,height), dtype=np.dtype(np.ushort))
image = np.ascontiguousarray(imagearray)
ptrimage = image.ctypes.data_as(ct.POINTER(ct.c_ushort))
DLL.example(width, height, ptrimage)

Это работает в python 2.7, но не в 3.2.

РЕДАКТИРОВАТЬ 2

Если изменения в ctypes являются только теми, на которые указывает Седрик, не имеет смысла, что python 3.2 не будет работать. Поэтому, снова взглянув на код, я обнаружил, что перед функцией, о которой я упоминаю, есть функция подготовки. Подпись:

void prepare(char *table)

В python я звоню:

table = str(aNumber)
DLL.prepare(table)

Возможно ли, что проблема связана с изменением обработки строки Python?

4b9b3361

Ответ 1

В Python 2.7 строки по умолчанию являются байтовыми строками. В Python 3.x по умолчанию они unicode. Попробуйте явно сделать вашу строку байтовой строкой, используя .encode('ascii'), прежде чем передать ее в DLL.prepare.

Edit:

#another way of saying table=str(aNumber).encode('ascii')
table = bytes(str(aNumber), 'ascii')
DLL.prepare(table)

Ответ 2

В соответствии с документацией на python здесь возможны только изменения между 2.7 и 3.2

Новый тип ctypes.c_ssize_t представляет тип данных s size_t.

В версии 2.7 появилась еще одна модификация:

Модуль ctypes теперь всегда преобразует None в указатель C NULL для аргументы, объявленные как указатели. (Изменено Томасом Хеллером; выпуск 4606.) Основная библиотека libffi обновлена ​​до версии 3.0.9, содержащий различные исправления для разных платформ. (Обновлено Матиас Клозе; вопрос 8142.)

Я не уверен, что это объяснит причину вашей проблемы...