Различия в 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?
Ответы
Ответ 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.)
Я не уверен, что это объяснит причину вашей проблемы...