10

私は(ここで)PyPyがcpyextを介してCPython拡張モジュールをサポートしていることを読みました。

cpyextのドキュメントが見つかりません。ありますか?

どうやって使うの?

ソースコード(例:ここleveldb.so)から、モジュールをロードするには、おそらくこれを行う必要があることがわかりました。

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

ただし、これは次のエラーでクラッシュします。

Fatal Python error: PyThreadState_Get: no current thread

バックトレースで、PyPyからではなくCPythonから関数を呼び出すことに気づきました。

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

LevelDBへの高速で機能豊富なPythonインターフェースであるPlyvelも、cpyextを使用してPyPyで実行すると、多くの単体テストのほとんどすべてに合格します。(1つの例外はスレッド化に関連しています。)インストールは「pipinstallplyvel」と同じくらい簡単です。コンパイラフラグをいじる必要はありません。

詳細については、 https://github.com/wbolster/plyvelおよびhttps://plyvel.readthedocs.org/を参照してください。

(免責事項:私はPlyvelを書きました。)

于 2012-12-10T23:53:56.260 に答える