小编liu*_*uyu的帖子

issubclass()在从不同路径导入的同一个类上返回False

目的是实现某种插件框架,其中插件是同一基类(即A)的子类(即B).基类使用标准导入加载,而子类使用知名包(即pkg)的路径加载imp.load_module().

pkg/
    __init__.py
    mod1.py
        class A
    mod2.py
        class B(pkg.mod1.A)
Run Code Online (Sandbox Code Playgroud)

这适用于真正的子类,即

# test_1.py
import pkg
from pkg import mod1
import imp
tup = imp.find_module('mod2', pkg.__path__)
mod2 = imp.load_module('mod2', tup[0], tup[1], tup[2])
print(issubclass(mod2.B, mod1.A)) # True
Run Code Online (Sandbox Code Playgroud)

但是在测试基类本身时出现了问题,

# test_2.py
import pkg
from pkg import mod1
import imp
tup = imp.find_module('mod1', pkg.__path__)
mod0 = imp.load_module('mod1', tup[0], tup[1], tup[2])
print(issubclass(mod0.A, mod1.A)) # False
Run Code Online (Sandbox Code Playgroud)

但是mod0.A和mod1.A实际上是来自同一文件(pkg/mod1.py)的同一个类.

这个问题出现在python 2.7和3.2中.

现在问题是双重的,a)它是一个预期的功能还是issubclass()的bug,以及b)如何在不改变pkg内容的情况下摆脱这个?

python class

7
推荐指数
2
解决办法
2593
查看次数

在扩展模块中更正循环垃圾收集

Python 2.7的doc的两个部分提到为扩展模块中定义的容器对象添加循环垃圾收集(CGC)支持.

Python的/ C API参考手册给出了两个规则,即

  1. 必须使用PyObject_GC_New()或分配对象的内存PyObject_GC_NewVar().
  2. 一旦初始化了可能包含对其他容器的引用的所有字段,它就必须调用PyObject_GC_Track().

而在扩展和嵌入Python解释器中,Noddy例如,添加Py_TPFLAGS_HAVE_GC标志和填充tp_traverse以及tp_clear插槽似乎足以启用CGC支持.上面的两个规则根本没有实践.

当我修改Noddy示例以实际遵循PyObject_GC_New()/ PyObject_GC_Del()PyObject_Track()/ 的规则时PyObject_GC_UnTrack(),令人惊讶地提出断言错误说,

Modules/gcmodule.c:348:visit_decref:断言"gc-> gc.gc_refs!= 0"失败.refcount太小了

这导致我对实现CGC的正确/安全方式感到困惑.任何人都可以给出建议,或者最好是一个有CGC支持的容器对象的简洁例子吗?

c python garbage-collection python-c-api python-extensions

6
推荐指数
1
解决办法
1101
查看次数

加载共享库时出错:libsandbox.so

当我在编译沙箱c程序后尝试运行.out文件时,它会出现以下错误:

    ./sandbox: error while loading shared libraries: libsandbox.so: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我该怎么办?

autoconf gcc sandbox shared-libraries

3
推荐指数
1
解决办法
2041
查看次数