所以我正在用C开发一个共享库,我现在正在使用ctypes编写一些Python包装器。这很好,但是我遇到了原生C类型地址的问题(例如c_int
)。
考虑以下SSCCE:
结构
root
-example.py
-pkg
--__init__.py
--foo.py
foo.py
from pkg import *
class Foo():
def fun(self, value):
x = ct.c_int(value)
print "Val "+str(value)+": " + str(ct.byref(x))
example.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
在两种情况下(即Foo.fun
内和example.py
内)返回3个不同的地址,因为每个对象应该是不同的
但是,当从对象的方法(在我的例子中,Foo.fun
)中实例化本机C类型时,我总是得到相同的地址。
示例输出:
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)。是什么给了什么?