10

我已经阅读(此处)PyPy 通过 cpyext 支持 CPython 扩展模块。

我还没有找到任何 cpyext 文档。有没有?

我该如何使用它?

从源代码(例如这里),我发现要加载我的leveldb.so模块,我可能必须这样做:

import cpyext
cpyext.load_module("leveldb.so","leveldb")

但是,这会因以下错误而崩溃:

Fatal Python error: PyThreadState_Get: no current thread

我在回溯中注意到它从我的 CPython 调用函数,而不是从 PyPy:

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   libsystem_kernel.dylib          0x00007fff8b3e4d46 __kill + 10
1   libsystem_c.dylib               0x00007fff927a9df0 abort + 177
2   org.python.python               0x0000000104692eaa Py_FatalError + 49
3   org.python.python               0x0000000104691370 PyThreadState_Get + 28
4   org.python.python               0x000000010468cf16 Py_InitModule4_64 + 58
5   leveldb.so                      0x00000001027e0881 initleveldb + 49 (leveldb_ext.cc:59)
6   pypy                            0x0000000100f59bb3 PyLong_CheckExact + 55379
7   pypy                            0x0000000100f6e7c7 PyLong_CheckExact + 140391
....
4

2 回答 2

6

我想到了。

需要重新编译模块。我必须使用 PyPy 的头文件。对于链接,我不能链接到 libpython。我必须告诉链接器忽略未解析的符号。

这是我在 MacOSX 上构建py-leveldb的命令:

cc -I /usr/local/Cellar/pypy/1.9/include -g -c leveldb_ext.cc leveldb_object.cc
libtool -dynamic -o leveldb.so leveldb_ext.o leveldb_object.o -lleveldb -lsnappy -lc -lstdc++ -undefined dynamic_lookup

那行得通。我刚做了cpyext.load_module("leveldb.so","leveldb")

我还在他们的 wiki 中找到了更多关于 CPyExt 的注释

于 2012-11-08T19:52:09.347 回答
-1

Plyvel 是 LevelDB 的快速且功能丰富的 Python 接口,当在带有 cpyext 的 PyPy 下运行时,它也通过了几乎所有的单元测试。(一个例外与线程有关。)安装就像“pip install plyvel”一样简单;无需摆弄编译器标志。

有关更多信息,请参阅https://github.com/wbolster/plyvelhttps://plyvel.readthedocs.org/

(免责声明:我写了 Plyvel。)

于 2012-12-10T23:53:56.260 回答