Различное поведение ctypes c_char_p?

Я смущен этим поведением разных версий python и не понимаю почему?

Python 2.7.5 (default, Aug 25 2013, 00:04:04) [GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.0.68)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> c="hello" >>> a=ctypes.c_char_p(c) >>> print(a.value) hello Python 3.3.5 (default, Mar 11 2014, 15:08:59) [GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.2.79)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> c="hello" >>> a=ctypes.c_char_p(c) Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: bytes or integer address expected instead of str instance 

Один работает, а другой дает мне ошибку. Какой из них правильный ?

Если оба они верны, как я могу достичь такого же поведения, как 2.7 в 3.3.5? Я хочу передать указатель char на C из python.

One Solution collect form web for “Различное поведение ctypes c_char_p?”

c_char_p является подклассом _SimpleCData , с _type_ == 'z' . Метод __init__ вызывает setfunc типа, который для простого типа 'z' является z_set .

В Python 2 функция z_set (2.7.7) записывается для обработки строк str и unicode . До Python 3 str является 8-битной строкой. CPython 2.x str внутренне использует строку с нулевым символом C (т. z_set Массив байтов, завершаемый символом \0 ), для которого z_set может вызывать PyString_AS_STRING (т. PyString_AS_STRING Получить указатель на внутренний буфер объекта str ). Строку unicode нужно сначала закодировать в байтовую строку. z_set обрабатывает эту кодировку автоматически и сохраняет ссылку на закодированную строку в _objects .

 >>> c = u'spam' >>> a = c_char_p(c) >>> a._objects 'spam' >>> type(a._objects) <type 'str'> 

В Windows стандартная строковая кодировка ctypes – 'mbcs' , при обработке ошибок – 'ignore' . На всех других платформах кодировка по умолчанию – 'ascii' , с 'strict' обработкой ошибок. Чтобы изменить значение по умолчанию, вызовите ctypes.set_conversion_mode . Например, set_conversion_mode('utf-8', 'strict') .

В Python 3 функция z_set (3.4.1) не автоматически преобразует str (теперь Unicode) в bytes . Парадигма смещается в Python 3, чтобы строго разделить строки символов из двоичных данных. Преобразования по умолчанию ctypes были удалены, как и функция set_conversion_mode . Вы должны передать c_char_p объект bytes (например, b'spam' или 'spam'.encode('utf-8') ). В CPython 3.x z_set вызывает функцию C-API PyBytes_AsString чтобы получить указатель на внутренний буфер объекта bytes .

Обратите внимание, что если функция C изменяет строку, вам нужно вместо этого использовать create_string_buffer для создания массива c_char . Ищите параметр, который будет набираться как const чтобы знать, что безопасно использовать c_char_p .

  • Напишите генератор или верните генератор?
  • Python3.4 не может установить mysql-python
  • Firebase Cloud Messaging (FCM) в Python с pyFCM - Регистрация клиента
  • Обезьяна, исправляющая @property
  • OSError: Недопустимый аргумент в подпроцессе
  • numpy & pandas 'ModuleNotFoundEror' в ноутбуке Jupyter (Python 3)
  • Это лучший способ добавить дополнительное измерение в массив numpy в одной строке кода?
  • Как передать аргументы команде Button в Tkinter?
  • Python - лучший язык программирования в мире.