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

我正在閱讀一本關於Ctypes和Python的書,但示例代碼不起作用。將字符串傳遞給Python 3.x下的ctypes函數

難道是因爲這本書是爲Python 2編寫的,而我是在Python 3上?

printf只打印第一個字母。

+4

請提供更多信息 - 您收到的實際錯誤消息,您嘗試過的其他選項正在工作或不工作。此外 - 更好,更具描述性的標題將爲您提供更多意見。 – dtlussier 2011-12-17 05:47:08

+0

也許吧。 Python 2的代碼對我來說工作得很好。你嘗試過嗎? – 2011-12-17 08:21:24

回答

19

C printf函數需要字節字符串。在Python 3的所有字符串都是unicode的,所以你必須編碼爲字節:

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

如果您有任何非ASCII字符編碼,然後到相關窗口代碼頁來代替。

2

bleh,使用「」.encode('ascii')是醜陋的。你經常可以這樣做:

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

注意'b'類型的字符串。這對python 2.7也是可移植的。