2017-06-19 29 views
2

我一直在修補pypy源代碼樹一週,現在想出了下面的問題 - 是否有任何方法來構建一個rpython程序作爲共享對象,它公開了它的一些功能(比如函數列表),換句話說,我希望這個函數可以通過共享對象導入從python腳本調用。 當我嘗試建立我的程序像這樣:從標準Python代碼調用基於rpython的函數

python rpython --shared -O2 some_program.py 

libmyprogram-c.so實際獲取生成,從CPython的unimportable雖然。我應該使用CFFI作爲cpython嗎?還是在rpython框架中有某種設施(裝飾器或其他東西)可以很好地切割它?

回答

4

有沒有真正方便的方法來做到這一點。正如你所描述的那樣:編寫一個RPython程序,轉入libmyprogram-c.so,然後從CPython訪問該C庫,例如與cffi。

在更多的細節,你會寫的RPython源代碼,使得.so出口您所選擇的C API,使用裝飾rpython.rlib.entrypoint.entrypoint_highlevel()。但是,你會得到一個在C級工作的C庫。根本沒有什麼能夠幫助你傳遞一個Python對象---你只有C類型。例如,沒有像「list」或「dict」這樣的數據結構的概念,也沒有跨越邊界的自動生命週期管理。

此外,調試使得libmyprogram-c.so比調試常規C庫困難的RPython源代碼。通常建議RPython程序或庫在您嘗試將其轉換爲C之前進行徹底測試,因爲至少您可以在Python上測試時進行調試。

當你有一個垃圾收集器的使用,調整爲高分配率,以及---最重要的是它的即時編譯器生成器時,RPython纔會發光,從RPython程序生成一個JIT編譯器if後者是某種動態的翻譯。如果你對此沒有用處,那麼RPython是不合適的。但是,如果你這樣做,這是一個不同的故事:-)