我已阅读(here)PyPy通过cpyext支持CPython扩展模块。
我还没有找到任何cpyext文档。有没有?
我该如何使用它?
从源代码(例如here),我发现要加载我的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
....
答案 0 :(得分: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 here中找到了关于CPyExt的更多注释。
答案 1 :(得分:-1)
Plyvel是一个快速且功能丰富的LevelDB Python接口,在使用cpyext在PyPy下运行时,它几乎通过了所有的单元测试。 (一个例外与线程有关。)安装就像“pip install plyvel”一样简单;无需摆弄编译器标志。
有关详细信息,请参阅https://github.com/wbolster/plyvel和https://plyvel.readthedocs.org/。
(免责声明:我写了Plyvel。)