2011-12-17 21 views
12
from ctypes import * 
msvcrt = cdll.msvcrt 
message_string = "Hello world!\n" 
msvcrt.printf("Testing: %s", message_string) 

Przechodzę przez książkę o Ctypes i Pythonie, ale przykładowy kod po prostu nie działa.przekazywanie ciągów do funkcji ctypes w Pythonie 3.x

Czy to możliwe, ponieważ książka została napisana dla Pythona 2, a ja na Pythonie 3?

printf drukuje tylko pierwszą literę.

+4

Podaj więcej informacji - rzeczywisty komunikat o błędzie, inne opcje, które próbujesz, które działają lub nie działają. Również - lepszy, bardziej opisowy tytuł zdobędzie więcej wyświetleń. – dtlussier

+0

Może. Kod działa dobrze dla mnie na Pythonie 2. Czy próbowałeś? –

+1

@dtlussier Nie ma komunikatu o błędzie, OP mówi, że printf drukuje tylko pierwszą literę. –

Odpowiedz

19

Funkcja C printf oczekuje ciągów bajtów. W Pythonie 3 wszystkie ciągi są Unicode, więc będziesz musiał kodować do bajtów:

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

Jeśli masz jakiekolwiek znaki spoza ASCII następnie zakodować do kodowej odpowiednich okien zamiast.

+2

Dzięki! Zadziałało. Dosłownie nie mogłem znaleźć odpowiedzi nigdzie. Co powinienem zmienić tytuł, aby ułatwić przyszłym użytkownikom, sir? – Edward

+0

Co powiesz na "przekazywanie ciągów znaków do funkcji ctypes w Pythonie 3.x"? – Duncan

2

bleh, używając "" .encode ("ascii") jest brzydki. Często można uciec: po prostu wykonaj to:

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

Zwróć uwagę na typ "b" dla napisu. Jest to również przenośne dla Pythona 2.7.

Powiązane problemy