我有一些麻烦理解python引用计数。 我想要做的是使用ctypes模块将元组从C++返回到python。
C++:
PyObject* foo(...)
{
...
return Py_BuildValue("(s, s)", value1, value2);
}
的Python:
pointer = c_foo(...) # c_foo loaded with ctypes
obj = cast(pointer, py_object).value
我不知道有关obj的引用计数,所以我尝试sys.getrefcount()
并获得3
。我认为它应该是2
(getrefcount
函数本身就是一个ref)。
现在我不能在C++中返回之前使Py_DECREF()
因为对象被删除。我可以减少python中的ref数量吗?
编辑 恰好裁判计数什么时候投函数被调用?我不确定从下面的文档。 http://docs.python.org/library/ctypes.html#ctypes.cast
ctypes.cast(OBJ,类型) 此功能类似于铸造操作中C.它返回类型的新实例,它指向同一个存储块与obj。 type必须是指针类型,obj必须是可以被解释为指针的对象。
但你创建一个python-c模块吧?我想跳过这一点,并与ctypes你可以只'ctypes.cdll.LoadLibrary('some.so')'。所以返回类型处理是不同的。用ctypes它是'ctypes.py_object'。然后我使用转换函数,并且我不确定引用计数是如何正确处理的。看我的编辑。 – tauran 2010-10-14 09:29:01
的确,这可能会更复杂一点......我试图读取cast()的代码源,但我没有足够的时间正确地调用。如果我找到证明ctypes拥有所有权的东西(如果是这种情况,可能应该考虑直接创建一个python-c对象来消除这些问题),我会尝试着看看有没有足够的时间并编辑我的答案。这很容易,因为你已经在使用PyObject了) – ThR37 2010-10-14 09:42:03