Различное поведение 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 .

  • Переобучение метода «in» внутри класса
  • Python threading.thread.start () не возвращает управление основной теме
  • Что делает команда `as` в Python 3.x?
  • GroupBy - Как извлечь секунды из DateTime с помощью diff ()
  • Проблемы с «пиренейтом», CentOS (& El Capitan)
  • Самый быстрый stdin / out IO в python 3?
  • языковой файл не загружается автоматически в Django
  • While-loop с if-statement быстрее, чем while-loop
  • Pythonic способ комбинировать блоки `for` и` try`
  • Как сделать атрибут класса исключительным для суперкласса
  • Разбор тега скрипта с помощью dicts в BeautifulSoup
  •  
    Interesting Posts for Van-Lav

    как скоро вызывается `__del__` после того, как счетчик ссылок падает до нуля?

    Python / django: невозможно импортировать GeoIP

    Где можно скачать бинарные яйца с psycopg2 для Windows?

    pandas.read_csv из строки или данных пакета

    Я, кажется, получаю сообщение об ошибке, хотя скрипт работает, я не понимаю, почему

    py2exe ImportError: нет модуля с именем <package I immedmented>

    Есть ли символ линии вверх? (Напротив \ n)

    График данных pandas с данными за год

    Разделите строку с неизвестным количеством пробелов в качестве разделителя в Python

    SQLAlchemy – эквивалент INSERT или REPLACE

    Python: обнаруживает, когда сокет отключается по какой-либо причине?

    Копирование содержимого файла в многомерный список в Python

    Почему python3 вызывает библиотеки python2?

    Возможно ли предварительно заполнить вход () в интерфейсе командной строки Python 3?

    Как преобразовать мой базовый код TensorFlow на основе подачи, чтобы использовать «Набор данных»?

    Python - лучший язык программирования в мире.