Python ctypes具有重复地址的变量

2024-09-30 01:36:20 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我正在用C语言开发一个共享库,目前我正在使用ctypes编写一些Python包装器。基本上没问题,但我在处理本机C类型的地址时遇到了麻烦(例如c_int)。在

考虑以下SSCCE:

结构

root
-example.py
-pkg
--__init__.py
--foo.py

食品

^{pr2}$

示例.py

from pkg.foo import *

print "Outside an object"
x = ct.c_int(1)
print "Val 1: " + str(ct.byref(x))
y = ct.c_int(2) 
print "Val 2: " + str(ct.byref(y))
z = ct.c_int(5) 
print "Val 5: " + str(ct.byref(z))

print "Within object"
foo = Foo()
foo.fun(1)
foo.fun(2)
foo.fun(5)

根据我对形式ctypes的理解,我希望byref在这两种情况下都返回3个不同的地址(即在Foo.fun内和在example.py内),因为每个对象都应该是不同的。在

然而,当从一个对象的方法中实例化一个本机C类型时(在我的例子中,Foo.fun),我总是得到相同的地址。在

样本输出:

Outside an object
Val 1: <cparam 'P' (0x7f79379440a0)>
Val 2: <cparam 'P' (0x7f7937944130)>
Val 5: <cparam 'P' (0x7f79379441c0)>
Within object
Val 1: <cparam 'P' (0x7f7937944250)>
Val 2: <cparam 'P' (0x7f7937944250)>
Val 5: <cparam 'P' (0x7f7937944250)>

第一次打印按预期提供了3个不同的地址(0x7f79379440a0、0x7f7937944130等),而来自Foo内部的打印总是返回相同的地址(0x7f7937944250)。什么给予?在


Tags: py类型objectfoo地址valctypesint

热门问题