管理R包的Python依赖关系

如果您正在编写一个使用网状的作为Python会话的接口,您可能还需要一个或多个安装在用户机器上的Python包可以让您的包工作正确。此外,您可能更愿意尽可能多地闲置用户从Python如何+网状的已配置。这个小插曲记录了一些实现方法这些目标。

创造“成功之坑”

总的来说,使用reticulate的R包作者的目标是创建一个可靠且不需要的默认体验用户进行干预或深入了解Python安装管理。同时,还应易于调整默认行为。有两个关键问题需要注意注意:

类似的程序包张量流通过提供helper函数来完成此任务,张量流::install_tensorflow(),并记录用户可以调用此函数来准备环境。对于例子:

图书馆(张量流)
安装传感器流()
#使用张量流

作为最佳实践,R包的Python依赖项应默认为安装在专门指定的隔离虚拟环境中用于R包。这将意外中断的风险降至最低用户系统上的另一个Python安装。

例如,安装传感器流()接受一个论点环境名称默认值为“r-张量流”。此默认值确保安装传感器流()将安装到名为“r-张量流”,可以根据需要创建它。

默认行为的对应方安装传感器流()是发生在张量流::.onLoad(),其中R包表示代表用户使用r-张量流环境(如果存在)。在包内,这两个部分起作用共同创造“成功之坑”:

安装传感器流量<- 功能(...,环境名称= “r-张量流”) {
网状的::py_安装(“tensorflow”,环境名称=envname,…)
}


.onLoad(加载)<- 功能(...) {
  使用虚拟机(“r-张量流”,需要= 错误的)
}

R包:

使用此设置,默认体验是用户调用安装传感器流()一次(创建“r-张量流”环境)。随后,呼叫库(张量流)将导致网状物使用r-张量流环境,一切都“正常工作”。破坏另一个Python的风险由于为R包指定了环境。同时,如果环境在一段时间后被破坏(可能是因为由于手动安装了冲突的Python依赖项),用户可以通过调用轻松恢复到工作状态安装传感器流().

Python环境有时会在以下情况下进入中断状态:安装了冲突的软件包版本回到工作状态就是删除环境并重新开始用一个新的。因此,安装传感器流()首先删除任何预先存在的“r-tensorflow”Python环境。但是,删除Python环境不是一件可以完成的事情很简单,所以默认情况下只删除默认的“r-tensorflow”环境。下面是助手的一个示例安装传感器流()具有“重置”行为。

#'@importFrom reticulate py_install virtualenv_exists virtualeenv_remove
安装传感器流<-
  功能(...,
           环境名称= “r-张量流”,
           新建(_E)= 完全相同的(环境名称,“r-张量流”)) {

  如果(新建_env&& 虚拟环境存在(环境名称)
    虚拟_删除(环境名称)

  py_安装(程序包= “tensorflow”,环境名称=envname,…)
}

管理多个包依赖项

隔离包环境方法的一个缺点是,如果使用网状结构的多个R包,然后这些包不是所有人都能在同一个环境中使用他们喜欢的Python环境R会话(因为在R会话中的时间)。要解决此问题,用户必须采取在管理Python环境中扮演更积极的角色。然而,这可以简单到提供一个独特的环境姓名。

最直接的方法是让用户创建一个专用的特定项目的Python环境。例如,用户可以在项目目录中创建一个虚拟环境,如下所示:

环境名称<- “./venv”
张量流::安装传感器流(环境名称=环境名称)
皮斯夸克::安装公园(_pyspark)(环境名称=环境名称)

如中所述Python的顺序发现向导,网状将自动发现并使用当前工作目录中的Python虚拟环境如下所示。或者,如果环境存在于项目目录之外,然后用户可以放置Renviron公司.R配置文件文件,确保reticulate将始终使用为配置的Python环境那个项目。例如Renviron公司项目中的文件目录可以包含:

网状_PYTHON_ENV=~/my/project/venv

或者是一个.R配置文件项目目录中的文件可以包含:

系统检测(“RETICULATE_PYTHON_ENV” = “~/my/project/venv”)

这种方法最大限度地降低了现有的、已经工作的,安装包会意外破坏Python环境,由于无意中升级或降级其他Python包已安装在环境中。

另一种方法是让用户安装R包的Python依赖关系到另一个已经位于搜索路径。例如,用户可以选择进入安装到默认值r-网状通风:

张量流::安装传感器流(环境名称= “r-网状”)

或者他们可以将一个包的依赖项安装到另一个包中默认环境。例如,将spark安装为默认值“r-张量流”环境:

张量流::安装传感器流()#创建“r-张量流”环境
皮斯夸克::安装公园(_pyspark)(环境名称= “r-张量流”)

此方法导出默认的安装助手函数特定环境,以及中的提示.onLoad()使用这种环境是创造“成功之坑”的一种方式。它鼓励一个健壮可靠的默认工作流,特别是对于不需要的用户但熟悉Python安装管理的机制。同时,安装助手功能允许用户管理Python环境,只需提供环境名称。使组合多个R包的依赖关系变得容易,如果由于相互冲突的Python依赖关系而出现问题提供了一种随时恢复到工作状态的简单方法,通过调用不带参数的helper函数。

自动配置

与上述方法相比,另一种方法是执行自动配置。客户端包可以声明其Python依赖项的方式使其自动安装在当前激活的Python环境。这是最方便的方法;当它工作时,它会感觉有点神奇,但它也是潜在的危险,如果出现问题,可能会导致沮丧错了。您可以通过您的包装描述文件,使用配置/网状字段。

具有自动配置,网状的设想一个包装Python包的不同R包可以生存的世界在同一Python环境/R会话中。仅此方法当包装的Python包没有冲突时工作依赖关系。

您必须判断R包的Python依赖性需要–如果自动引导Python安装打包到用户的活动Python环境中,无论它是什么contain是默认执行的安全操作。例如,这是很可能是Python包的安全操作,如请求,但对于经常更新了包含许多依赖项的包,如火炬张量流(例如,对于火炬张量流具有冲突的版本要求依赖关系,如numpy公司库达). 记住与CRAN不同,PyPI不执行任何兼容性或跨包存储库进行一致性检查。

使用配置/网状

作为包作者,您可以选择自动配置,如这个。例如,如果我们有一个包裹rscipy公司作为的接口科学Py蟒蛇包,我们可以使用以下内容描述文件:

包装:rscipy标题:scipy的R接口版本:1.0.0描述:为Python包scipy提供R接口。配置/网状:列表(packages=列表(列表(package=“scipy”)))< ... 其他字段…>

安装

有了这个,网状的将自动处理为用户配置Python环境rscipy公司包已加载并使用(即它不再为用户提供特殊安装传感器流()-类型函数,尽管它仍然是建议这样做)。

具体来说,在rscipy公司包已加载将发生以下情况:

  1. 除非用户明确指示网状的要使用现有的Python环境,网状的提示用户下载并安装小蟒蛇(如果必要时)。

  2. 在此之后,当Python会话由网状的,中已加载包的所有声明依赖项配置/网状将被发现。

  3. 然后将这些依赖项安装到适当的Conda环境,由Miniconda安装提供。

在这种情况下,最终用户工作流将与R完全相同没有Python依赖项的包:

图书馆(卢比)
#使用该软件包

如果用户在他们的系统将提示他们安装Miniconda。如果他们真的有Python,然后是所需的Pythons包(在本例中松软的)将安装在标准共享环境中用于R会话(通常是虚拟环境或Conda环境命名为“r-网状”)。

实际上,用户必须一次性支付,大部分是自动支付初始化成本以使用您的包,然后事情就会像其他R包一样工作。特别是,用户在其他方面没有详细说明如何网状的作品。

.onLoad(加载)配置

在某些情况下,用户可能会在Python已初始化。确保网状的可以仍然配置活动的Python环境,您可以包括以下代码:

.onLoad(加载)<- 功能(库名称,pkgname){
网状的::配置环境(pkgname)
}

这将说明网状的立即尝试配置活动的Python环境,安装任何所需的Pytython必要时打包。

版本

这些机制的目标是实现轻松的互操作性具有Python依赖性的R包之间,以及最小化最终用户的专用版本/配置步骤。为此,网状的将(默认情况下)跟踪旧版本的与当前版本相比,Python包有时间进行调整。不支持Python 2。

打破这些规则的工具尚未实现,但将根据需要提供。

格式

声明的Python包依赖项应该具有以下内容格式:

例如,我们可以更改配置/网状上面的指令规定科学[1.3.0]从PyPI安装(带有管道):

配置/网状:列表(packages=列表(列表(package=“scipy”,version=“1.3.0”,pip=TRUE)))