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

Передача строк в функции ctypes в Python 3.x

from ctypes import *
msvcrt = cdll.msvcrt
message_string = "Hello world!\n"
msvcrt.printf("Testing: %s", message_string)

Я просматриваю книгу о Ctypes и Python, но код примера просто не работает.

Может быть, потому, что книга была написана для python 2, тогда как я на Python 3?

printf печатает только первую букву.

4b9b3361

Ответ 1

Функция C printf ожидает байтовые строки. В Python 3 все строки являются unicode, поэтому вам придется кодировать в байты:

>>> msvcrt.printf("Testing: %s".encode('ascii'), message_string.encode('ascii'))
Testing: Hello world!
22

Если у вас есть символы не-ascii, тогда вместо этого кодируйте соответствующую кодовую страницу Windows.

Ответ 2

bleh, использование ".encode('ascii') является уродливым. Вы часто можете уйти от этого:

TTF_OpenFont(b"assets/droid.ttf", 10)
             ^^

Обратите внимание на тип 'b' для строки. Это также переносится на python 2.7.