2017-06-19 56 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是不合适的。但是,如果你这样做,这是一个不同的故事:-)