由于reticulate_python

问题描述

我有一个要部署在Shinyapps.io上的应用程序。我认为必须注意,在应用程序中,数据是从雅典娜的数据库提取的。我使用软件包 Rathena 连接到数据库,并且所有内容都可以从我的计算机在本地正常运行。但是,我尝试将其部署在Shinyapps.io上,并收到一条消息,指出发生了错误。我在部署它后会在弹出的窗口中看到它。我去查看了Shinyapps.io的日志部分,然后看到消息:

警告:使用网状但未指定python;将在/ usr / bin / python3使用python 在发布之前,您忘了在.Rprofile中设置RETIculaTE_PYTHON环境变量吗?

我从未使用过.Rprofile,也不知道RETIculaTE_PYTHON的含义。无论如何,他们说堆栈溢出谷歌是您最好的朋友。我在Github上找到了本教程,名为 Tutorial: using Shiny + reticulate to create apps with R and Python 3。我按照最初的步骤做了,然后最后说:

确认.Rprofile文件包含在项目的目录中,并且已与server.R和ui.R一起部署到Shinyapps.io。该文件设置了RETIculaTE_PYTHON环境变量,该变量告诉网状结构如何在Shinyapps.io服务器上找到Python虚拟环境的位置。

我查了一下.Rprofile是什么,我认为它只是代码脚本,但没有告诉我应该在其中放置什么代码。我想我需要提及的是,包 Rathena 使用Python代码连接到数据库

我还读过一些地方,应该在我的.Renviron文件中将此行 RETIculaTE_PYTHON = / usr / local / bin / python3 放置。我这样做了,现在当我尝试在计算机上本地运行该应用程序时,出现错误消息:

错误:未检测到Boto3,请使用以下命令之一安装boto3:终端中的pip install boto3 numpyinstall_boto()。 如果这不起作用,请使用reticulate::use_python()reticulate::use_condaenv()

设置要使用的python

这没有意义,因为我已经安装了boto3,甚至在终端上也显示

已经满足要求:.​​/Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages(1.14.28)中的boto3

我觉得我在这里转圈。

解决方法

这实际上是在本地运行软件并在另一个环境中运行的一个相当烦人的问题,我想说解决方案通常不是很明显。您可能不是第一个遇到此问题的人。

以下是我认为相关的一些事实:

  • reticulate需要知道您的Python可执行文件在计算机上的位置
  • 您的计算机与虚拟计算机Shinyapps.io之间的Python可执行文件差异的位置从以下位置运行您的Shiny应用程序
  • reticulate似乎可以从RETICULATE_PYTHON环境变量确定您的Python可执行文件在哪里,但是当未设置该变量时,它也具有一些默认行为
  • 与虚拟计算机Shinyapps.io上的可执行文件相比,计算机上的Python可执行文件位于不同位置
  • 当您将RETICULATE_PYTHON中的.Rprofile的值设置为shinyapps.io所需的值时,由于您的Python环境不同,设置会中断

我尚未测试此解决方案,但我认为此修复实际上在您的链接中!检出https://github.com/ranikay/shiny-reticulate-app/blob/master/.Rprofile,看看它们不仅仅包含对RETICULATE_PYTHON的简单赋值,还实际使用条件语句根据(Sys.info()[['user']]的结果设置各种值。 / p>

根据R是否在本地计算机上执行(Sys.info()[['user']],而不是虚拟计算机Shinyapps.io,R会在您的Shiny应用程序上运行,并且链接的.Rprofile正在执行{根据R是在本地计算机上还是在另一台计算机上运行来设置各种值的工作。所有这些都可以使用,因为shinyapps.io

从.Rprofile中的代码中,我可以知道Shinyapps.io在名为“ shiny”的用户下运行您的Shiny应用程序,

.Rprofile

并且他们甚至在其中添加了一个条件块来支持RStudio Connect,它显然以名为if (Sys.info()[['user']] == 'shiny'){ Sys.setenv(RETICULATE_PYTHON = paste0('/home/shiny/.virtualenvs/',VIRTUALENV_NAME,'/bin/python')) } 的用户而不是“ shiny”的用户身份运行您的Shiny应用程序:

rstudio-connect

最后,} else if (Sys.info()[['user']] == 'rstudio-connect'){ Sys.setenv(RETICULATE_PYTHON = paste0(VIRTUALENV_NAME,'/bin/python')) } 使用.Rprofile语句来捕获其他任何情况,这将与您在自己的计算机上运行时的情况匹配:

else

根据您上面的描述以及在linked tutorial上看到的内容,我认为您几乎可以将其中的整个} else { # RETICULATE_PYTHON is not required locally,RStudio infers it based on the ~/.virtualenvs path 复制到您的项目中,并且可能只需进行少量修改或第二,您应该能够使用.Rprofile使Shiny应用程序在本地运行并在Shinyapps.io上运行。

但是,我们看到 not 设置reticulate符合通过运行virtualenv定义的行为,因此我建议您在此处将RETICULATE_PYTHON设置为诸如location或your基于miniconda的Python可执行文件。我猜该值可能是RETICULATE_PYTHON或类似值。

如果您不想复制链接的./Library/r-miniconda/envs/r-reticulate/bin/python3并根据需要对其进行修改,则可以将其更改为仅包含以下行:

.Rprofile

然后尝试在本地运行并部署。

这种根据程序运行的环境不同地设置环境变量的模式实际上是软件工程中公认的最佳实践[1],因此,当您在本地构建应用程序时,这种模式可能会在将来为您服务并部署到其他环境。

[1] https://12factor.net