从标准 python 代码调用基于 rpython 的函数
Invoke rpython based functions from standard python code
我已经对 pypy 源代码树进行了一个星期的修补,并提出了以下问题 - 是否有任何方法可以将 rpython 程序构建为共享对象,从而公开其某些功能(比如一个函数列表)用于标准 cpython vm,换句话说,我希望这个函数可以通过共享对象导入从 python 脚本中调用。
当我尝试像这样构建我的程序时:
python rpython --shared -O2 some_program.py
libmyprogram-c.so 实际上是生成的,但不能从 cpython 导入。接下来我应该将 CFFI 用于 cpython 还是 rpython 框架中有某种设施(装饰器或其他东西)应该很好地削减它?
没有真正方便的方法来做到这一点。正如您所描述的:编写一个 RPython 程序,转换为 libmyprogram-c.so
,然后从 CPython 访问该 C 库,例如与 cffi.
更详细地说,您将编写 RPython 源代码,以便 .so
通过使用装饰器 rpython.rlib.entrypoint.entrypoint_highlevel()
导出您选择的 C API ].但是随后你会得到一个在 C 级别工作的 C 库。根本没有任何东西可以帮助你传递一个 Python 对象——你只有 C 类型。例如,没有像 "list" 或 "dict" 这样的数据结构的概念,也没有跨边界的自动生命周期管理。
此外,调试 libmyprogram-c.so
的 RPython 源代码比调试常规 C 库更难。通常的建议是在尝试将 RPython 程序或库转换为 C 之前对其进行彻底测试,因为至少在 Python.[=14 之上测试它时可以进行调试=]
RPython 只有在您使用它的垃圾收集器时才会发光,调整到高分配率,并且——最重要的——它的即时编译器生成器,生成一个 JIT如果后者是某种动态解释器,则来自 RPython 程序的编译器。如果你对此没有用,那么 RPython 是不合适的。但是,如果你这样做,那就是另一回事了:-)
我已经对 pypy 源代码树进行了一个星期的修补,并提出了以下问题 - 是否有任何方法可以将 rpython 程序构建为共享对象,从而公开其某些功能(比如一个函数列表)用于标准 cpython vm,换句话说,我希望这个函数可以通过共享对象导入从 python 脚本中调用。 当我尝试像这样构建我的程序时:
python rpython --shared -O2 some_program.py
libmyprogram-c.so 实际上是生成的,但不能从 cpython 导入。接下来我应该将 CFFI 用于 cpython 还是 rpython 框架中有某种设施(装饰器或其他东西)应该很好地削减它?
没有真正方便的方法来做到这一点。正如您所描述的:编写一个 RPython 程序,转换为 libmyprogram-c.so
,然后从 CPython 访问该 C 库,例如与 cffi.
更详细地说,您将编写 RPython 源代码,以便 .so
通过使用装饰器 rpython.rlib.entrypoint.entrypoint_highlevel()
导出您选择的 C API ].但是随后你会得到一个在 C 级别工作的 C 库。根本没有任何东西可以帮助你传递一个 Python 对象——你只有 C 类型。例如,没有像 "list" 或 "dict" 这样的数据结构的概念,也没有跨边界的自动生命周期管理。
此外,调试 libmyprogram-c.so
的 RPython 源代码比调试常规 C 库更难。通常的建议是在尝试将 RPython 程序或库转换为 C 之前对其进行彻底测试,因为至少在 Python.[=14 之上测试它时可以进行调试=]
RPython 只有在您使用它的垃圾收集器时才会发光,调整到高分配率,并且——最重要的——它的即时编译器生成器,生成一个 JIT如果后者是某种动态解释器,则来自 RPython 程序的编译器。如果你对此没有用,那么 RPython 是不合适的。但是,如果你这样做,那就是另一回事了:-)