RMarkdown中knitr的Python语言引擎如何跨代码块跟踪变量
knitr Python代码块跨块调用变量的实现原理
- 核心依赖reticulate的嵌入式常驻解释器:当前版本knitr的Python语言引擎没有使用早期runr包的套接字通信方案,而是直接调用reticulate包的能力,在当前R会话进程内嵌入一个持久运行的Python解释器实例,而非每个代码块单独启动、销毁独立Python进程。所有Python代码块的代码都会提交到这个同一个解释器实例中执行,前序块定义的变量、导入的依赖都会保留在解释器的
__main__全局命名空间中,后续块自然可以直接调用。 - 命名空间的映射逻辑:reticulate会在R环境中生成一个对应Python
__main__模块的代理对象py,你在Python代码块中定义的变量本质上都会挂载到这个代理对象上,比如Python块中的x = "test"等价于在R环境中执行py$x = "test",该值会一直留存直到R会话终止或主动清理Python环境。 - 你可以自行验证该逻辑,在R控制台依次执行以下命令,就能复现和knitr跨块调用完全一致的效果:
library(reticulate) py_run_string("x = 123") py_run_string("print(x)") - 之所以你在现有代码中找不到套接字相关实现,是因为嵌入式解释器方案比跨进程套接字通信的执行效率更高、数据传输成本更低、适配难度更小,已经完全替代了早期的实验性方案。
内容的提问来源于stack exchange,提问作者user9006908
相关产品推荐
相关产品推荐

