R renv 与 Python 虚拟环境 vs Julia 环境

4
这三种被引用的“虚拟化”解决方案(Renv适用于R,Python虚拟环境Julia环境)是否可比较,它们是否试图回答相同的需求(项目隔离、可重复性等),并提供相同的“解决方案”,或者它们在范围和/或实现方面存在显着差异?
2个回答

11

我无法回答关于 renv 的问题,因为我没有使用过。但是我可以讲一下 Python 虚拟环境和 Julia 环境之间的区别。

正如您所猜测的那样,Python虚拟环境和Julia环境都满足项目隔离和可重现性的需求(以及通常与环境相关的所有内容)。然而,它们采用非常不同的方式来满足这些需求。

Python虚拟环境基本上是包含了一个完整的Python栈副本的文件夹,用于创建虚拟环境,即其中包含单独的python可执行文件、与之关联的完整栈以及单独的site-packages文件夹,用于包含在该环境中安装的所有Python软件包,包括单独的pipsetuptools的副本。这就是实现完全隔离的方式:每个环境都可以完全独立地处理软件包的安装。要使用虚拟环境,您需要激活它们,这意味着将指向特定Python可执行文件所在的文件夹的路径临时添加到PATH环境变量中,以便在命令行上运行python时运行正确的版本。这使得Python虚拟环境相对容易理解和使用,但相对较重,因为您基本上为每个创建的环境拥有一个完整的Python栈副本,包括完整的软件包集(在多个环境中可能有大量重复的软件包)。

另一方面,Julia 是内置环境管理的语言,而不像 Python 那样是附加功能。因此,环境从语言本身处理。Julia 环境只是一个具有 Project.toml 的文件夹。这就是全部。Julia 包安装在称为“仓库”的位置,多个版本的同一软件包可以并存。当您向 Julia 环境中添加包时,Julia(在解决依赖关系后)首先检查所需软件包的版本是否已经在仓库中。如果是,则使用该软件包的该版本。仅当需要的软件包版本缺失时才会下载它。这意味着软件包的一个版本仅会被安装一次,并且多个环境可以重复使用相同的软件包,同时仍然相互隔离。在 Julia 中 “激活” 一个环境只需要让 Julia 使用该特定文件夹中的 Project.toml 决定使用哪些软件包。这种架构使得 Julia 环境特别轻巧。另外,它允许所谓的“堆叠环境”,您可以激活多个环境,并逐个搜索它们以选择要使用的软件包(通常情况下,当您在激活环境时运行 Julia 时,它总是堆叠在默认环境上,该环境始终处于激活状态)。

我希望这可以帮到你。从实现的角度来看,Python虚拟环境和Julia环境截然不同。


Julia的方法也有一个(有时不幸的)后果,即Julia版本本身无法由环境管理。 - phipsgabler
1
真的 @phipsgabler。我其实想提到这一点,但是忘了,所以谢谢你提醒。虽然你说得对,但我的经验是使用像 https://asdf-vm.com/#/ 这样的版本管理器基本上解决了这个问题。 - Tsela
在 Julia 1.7 中,manifest.toml 现在将存储用于创建它的 Julia 版本:https://julialang.org/blog/2021/11/julia-1.7-highlights/#new_manifest_format - hdavid16

4

回答来自 R/renv 方面: 默认情况下,R 从由.libPaths()函数声明或设置的库路径加载包,这通常包括用户特定的库路径、零个或多个站点库路径和一个系统库。

例如,在 macOS 上使用 R 4.0.3,我看到:

> .libPaths()
[1] "/Users/kevinushey/Library/R/4.0/library"
[2] "/Library/Frameworks/R.framework/Versions/4.0/Resources/library"

这些库路径被所有R会话共享。而renv只是让设置项目本地库路径变得更加容易,因此在renv项目中,你可能会看到:

> .libPaths()
[1] "/Users/kevinushey/scratch/project/renv/library/macos/R-4.0/x86_64-apple-darwin17.0"
[2] "/Library/Frameworks/R.framework/Versions/4.0/Resources/library"

通常,这些项目本地库路径是由renv自动装载程序设置到项目的.Rprofile(当R启动时读取和执行),或者由用户显式调用renv::load("~/path/to/project")来设置。

renv不会管理或控制与项目本身使用的R版本,至少在版本0.12.3中没有这样做:这由用户或管理员处理。 renv会在生成锁定文件(捕获项目中的R软件包依赖项)时写入正在使用的R版本,因此理论上前端可以使用该信息选择要与项目一起使用的适当解释器。

在这个意义上,renv的工作比Python和Julia做得少,因为它只帮助管理项目中使用的R软件包;至少目前还没有提供任何将特定版本的R与项目关联的工具。然而,它也独特的是一个独立的R软件包,不像一些Python和Julia的工具集,内置于R本身。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接