ctypes在Python解释器中的行为异常
我对ctypes有一个有趣的问题;虽然它似乎在常规python脚本中工作,但当我在带printf()的解释器中使用它时,它会在字符串本身之后打印字符串的长度。演示:ctypes在Python解释器中的行为异常,python,ctypes,Python,Ctypes,我对ctypes有一个有趣的问题;虽然它似乎在常规python脚本中工作,但当我在带printf()的解释器中使用它时,它会在字符串本身之后打印字符串的长度。演示: 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
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
有人知道为什么会发生这种情况吗?从printf(3)手册页:
成功返回后,这些函数返回打印的字符数(不包括用于结束字符串输出的尾随'\0'
)
python解释器在调用后显示printf()
的返回代码。由于字符串末尾没有换行符\n
,因此打印输出后会立即打印长度。请注意,这不会发生在脚本中,只有在以交互方式使用python时才会发生
您可以通过分配来隐藏此内容:
ret = libc.printf("Test\n")
奇怪的是,将python str传递给需要char*的函数是否危险?是的,如果函数需要修改字符串的内容。Python字符串是不可变的。ctypes有一个create_string_buffer()函数来创建可以修改的字符数组。请注意,
int
不是保留字,实际上是一个内置属性。你不应该养成给它分配引用的习惯。我知道,但这只是一个小的解释器测试。