Различия в типах между Python 2 и 3 - PullRequest
14 голосов
/ 31 августа 2011

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

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

Я безуспешно пытался использовать как python, так и numpy массивы.

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

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

EDIT

Вот пример кода. 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)

В питоне я звоню по:

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

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

Ответы [ 2 ]

20 голосов
/ 31 августа 2011

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

Редактировать:

#another way of saying table=str(aNumber).encode('ascii')
table = bytes(str(aNumber), 'ascii')
DLL.prepare(table)
0 голосов
/ 31 августа 2011

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

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

В 2.7 были введены некоторые другие модификации :

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...