2010-08-25 93 views
4

我對ctypes有一個有趣的問題;雖然它似乎可以在普通的Python腳本中工作,但當我在printf()中使用它時,它會在字符串本身之後打印字符串的長度。演示:ctypes在Python解釋器中行爲奇怪

Python 2.6.5 (r265:79063, Apr 16 2010, 13:09:56) 
[GCC 4.4.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> from ctypes import * 
>>> libc = CDLL("libc.so.6") 
>>> libc.printf("Test") 
Test4 
>>> int = 55 
>>> libc.printf("Test %d", int) 
Test 557 
>>> int = c_int(55) 
>>> libc.printf("Test %d", int) 
Test 557 

有沒有人知道爲什麼會發生這種情況?

+2

只是注意 - 而'int'是不是保留字,其實它是一個內置的屬性。你不應養成爲它分配參考的習慣。 – 2010-08-25 18:16:26

+0

我知道,但這只是一個小解釋測試。 – 2010-08-25 18:18:32

回答

8

從printf的(3)手冊頁:

在成功返回,這些函數返回打印的字符(不包括用於結束輸出到串後’\0’)的數量。

python解釋器在您調用它後顯示printf()的返回碼。由於您的字符串末尾沒有換行\n,打印輸出後立即打印出長度。請注意,這不會在腳本中發生,只有在交互式使用python時纔會發生。

你可以用分配隱藏此:

ret = libc.printf("Test\n") 
+0

只是好奇,將一個python str傳遞給期望char *的函數是否危險? – Mark 2010-08-25 18:12:14

+1

是的,如果函數期望修改字符串的內容。 Python字符串是不可變的。 ctypes有一個create_string_buffer()函數來創建可以修改的字符數組。 – 2010-08-26 06:05:12