将扩展迁移到python3,丰富的比较

时间:2016-02-20 21:47:26

标签: python c python-3.x

我尝试将项目迁移到Python 3.4,并且我无法理解和实现Python3丰富的比较功能。该项目实现了C库的Python扩展

我是Python新手,自从我做了任何C以来已经过了大约15年

我没有写原始项目而且它被放弃了。它在2012年只有一次提交,它基于2006年的另一位作者的工作。但是,该项目正是我想要的,所以我热衷于恢复和更新它。

我已经能够将没有错误的代码更新到Python 2.7并使其运行并通过测试。我还创建了一个Python 3.4分支,现在可以无误地构建。这是通过基本查找编译器抛出的每个错误和警告并实现建议的修复来完成的。

然而,当我在编译它之后用Python 3.4导入库时:

python3 setup.py install

我收到以下错误:

>>> import _suffix_tree
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Type _suffix_tree.SuffixTreeNode defines tp_reserved
(formerly tp_compare) but not tp_richcompare. Comparisons may not behave as intended.

查看扩展名确实没有tp_richcompare实现,所以我试图添加它。 我已尝试实施我在网上找到的几种解决方案,但没有一种方法可行,而且我对此问题的了解不够,无需帮助即可解决问题。我尝试过没有成功实现所需的丰富比较功能。我尝试过的一个尝试的例子是:

static PyObject* Node_richcmp(NodeObject *n1, NodeObject *n2, int op);

static PyObject* Node_richcmp(NodeObject    *n1, NodeObject *n2, int op)
{
    return (int)(n1->node - n2->node);
}

Node_richcmp,                          /* tp_richcompare */

但是我得到的错误如下:

python_bindings.c:218:2: warning: initialization from incompatible pointer type [enabled by default]
  Node_richcmp,         /* tp_richcompare */
  ^
python_bindings.c:218:2: warning: (near initialization for 'NodeType.tp_richcompare') [enabled by default]
python_bindings.c: In function 'Node_richcmp':
python_bindings.c:418:5: warning: return makes pointer from integer without a cast [enabled by default]
     return (int)(n1->node - n2->node);
     ^

现在我根据错误进行猜测并进行一些搜索,即我搞砸了一个值VS的地址分配,但我不确定这是否正确或如何去关于修理它。

有人可以帮我实现所需的丰富比较方法吗?

我尝试了以下资源:http://py3c.readthedocs.org/,但我还没有得到它。

可以在此处找到项目的完整代码:python_34分支上的https://github.com/mattporritt/suffix-tree-unicode

2 个答案:

答案 0 :(得分:0)

您不能只复制先前的tp_compare实施。 tp_richcompare有一个considerably different contract。它(通常)返回Py_TruePy_False而不是-101,其返回值应取决于所请求的比较({{ 1}})。

答案 1 :(得分:0)

最后,我使用ctypes获取解决方案:https://docs.python.org/3.4/library/ctypes.html 我将库编译为共享对象(.so),并且能够在大约15分钟内获得基本的Python接口。我所需要的只是作为c库的API接口,所以ctypes正是我所需要的,比CFFI或我使用的原始方法更容易。