Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
查找python对象的隐藏位置_Python_Cython - Fatal编程技术网

查找python对象的隐藏位置

查找python对象的隐藏位置,python,cython,Python,Cython,我遇到了一个问题,其中有一个python对象隐藏在某个地方。该对象是一个C库的包装器,我需要在退出时调用释放例程,否则(幕后)线程将挂起(它是一个cython对象,因此释放被放入\uuuuuu dealoc\uu方法) 问题是我一辈子都搞不清楚物体藏在哪里。我没有故意引入任何全球国家。有什么方法可以确定物体在哪里逗留吗?它可能只是一个挥之不去的对象循环,所以gc应该把它捡起来吗?也就是说,如果可能的话,我真的很想找出问题的原因 编辑:我解决了这个问题,这是因为pyglet事件处理程序没有被干净地

我遇到了一个问题,其中有一个python对象隐藏在某个地方。该对象是一个C库的包装器,我需要在退出时调用释放例程,否则(幕后)线程将挂起(它是一个cython对象,因此释放被放入
\uuuuuu dealoc\uu
方法)

问题是我一辈子都搞不清楚物体藏在哪里。我没有故意引入任何全球国家。有什么方法可以确定物体在哪里逗留吗?它可能只是一个挥之不去的对象循环,所以
gc
应该把它捡起来吗?也就是说,如果可能的话,我真的很想找出问题的原因

编辑:我解决了这个问题,这是因为pyglet事件处理程序没有被干净地删除。它们位于
\uuuu del\uuuu
方法中,但是没有删除该对象,因为事件调度器持有一个对象方法。这在逻辑上是很好的,但我觉得奇怪的是,即使在退出时,对象也从未被删除。有人知道为什么在解释器出口处不调用
\uu del\uu
?事实上,这个问题有——尽管答案并不精彩

无论如何,基本问题仍然存在——我如何可靠地找到这些挥之不去的引用?

一个可能的地方是,它是一个对象列表,这些对象被发现无法访问,但无法删除,因为它们在一个循环中包含
\uu del\uu
方法

在3.4之前的Python中,如果您有一个包含多个
\uuu del\uu
方法的循环,那么解释器不知道应该以哪种方式执行它们,因为它们可能具有相互引用。因此,它不执行任何操作,而是将对象移动到此列表中

如果您在那里找到了对象,文档建议您执行
del gc.garbage[:]


首先,避免这种情况的解决方案是在可能的情况下使用weakrefs来避免循环。

您检查过沙发的背面了吗p@JonClements事实上,我也做了类似于网络的事情——用谷歌搜索。唯一明智的帖子是我在两年前问了几乎相同的问题;)(虽然这并不完全令人满意,所以我们来了)。你可能知道的比我多,但这里有一些想法。如果获得Python的调试版本,则可以使用函数
sys.getobjects()
打印当前分配的所有对象。如果它主要是Cython代码,则可能会有所帮助。如果知道是哪个类导致了问题,可以尝试在分配和解除分配方法中插入print语句。Cython's也可能有助于澄清问题。@IanH谢谢!这个问题有点邪恶,并提出了一些有趣的建议来改进代码。我认为Cython模块中需要一些清理代码,以便在退出时进行清理,即使对象没有被彻底删除。我认为Python在调用对象上的各种delete方法方面过于宽松;这不是我第一次遇到这种类型的问题。对象的生存期有点不可预测。@Henrygomers您没有使用任何堆栈帧,是吗?也就是说,您没有在任何地方使用
introspect
库?挥之不去的堆栈帧可以做你所看到的。问题是它实际上不是一个无法到达的对象,而是一个我无法确定它隐藏在哪里的对象<不过,code>gc.garbage很有用。助教!