【问题标题】:Problems with deployment of shiny app due to reticulate_python由于 reticulate_python 部署闪亮应用程序的问题
【发布时间】:2020-10-06 07:32:05
【问题描述】:

我有一个要部署在 shinyapps.io 上的应用程序。我认为重要的是要注意应用程序中的数据是从 athena 的数据库中提取的。我使用包 Rathena 连接到数据库,并且所有东西都可以在我的计算机本地正常运行。但是,我尝试将其部署在 shinyapps.io 上,并收到一条消息,指出发生了错误。我只是在部署后弹出的窗口中看到了这一点。我去查看了 shinyapps.io 的日志部分,我看到了这样的消息:

警告:使用 reticulate 但未指定 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 环境变量,它告诉 reticulate 在 shinyapps.io 服务器上的何处定位 Python 虚拟环境。

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

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

错误:未检测到 Boto3 请在终端中使用 pip install boto3 numpyinstall_boto() 安装 boto3。 如果这不起作用,请将您正在使用的 python 设置为 reticulate::use_python()reticulate::use_condaenv()

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

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

我觉得我在这里兜圈子。

【问题讨论】:

标签: python r shiny reticulate


【解决方案1】:

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

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

  • reticulate 需要知道您的 Python 可执行文件在计算机上的位置
  • Python 可执行文件的位置不同在您的计算机和虚拟计算机 shinyapps.io 之间运行您的 Shiny 应用程序
  • reticulate 似乎可以确定您的 Python 可执行文件来自 RETICULATE_PYTHON 环境变量的位置,但在未设置变量时也有一些默认行为
  • 您计算机上的 Python 可执行文件与虚拟计算机上的可执行文件位于不同位置,shinyapps.io 从
  • 运行您的 Shiny 应用程序
  • 当您将 .Rprofile 中的 RETICULATE_PYTHON 的值设置为 shinyapps.io 需要的值时,您的设置会中断,因为您的 Python 环境不同

我尚未将此作为解决方案进行测试,但我认为修复实际上在您的链接中!查看https://github.com/ranikay/shiny-reticulate-app/blob/master/.Rprofile 并了解它们如何包含更多内容,而不仅仅是将值分配给RETICULATE_PYTHON,并实际使用条件语句根据(Sys.info()[['user']] 的结果设置各种值。

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

从 .Rprofile 中的代码,我可以看出 shinyapps.io 在名为“shiny”的用户下运行您的 Shiny 应用,

if (Sys.info()[['user']] == 'shiny'){
  Sys.setenv(RETICULATE_PYTHON = paste0('/home/shiny/.virtualenvs/', VIRTUALENV_NAME, '/bin/python'))
}

他们甚至在其中添加了一个条件块来支持 RStudio Connect,它显然在名为 rstudio-connect 而不是“shiny”的用户下运行您的 Shiny 应用程序:

} else if (Sys.info()[['user']] == 'rstudio-connect'){
  Sys.setenv(RETICULATE_PYTHON = paste0(VIRTUALENV_NAME, '/bin/python'))
}

最后,.Rprofile 使用else 语句来捕获任何其他情况,这将与您在自己的计算机上运行时的情况相匹配:

} else {
  # RETICULATE_PYTHON is not required locally, RStudio infers it based on the ~/.virtualenvs path

根据您上面描述的内容以及我在linked tutorial 看到的内容,我认为您几乎可以将他们在那里的整个.Rprofile 复制到您的项目中,并且可能只需进行一两次小的修改,您应该能够使用reticulate 让您的 Shiny 应用在本地和 shinyapps.io 上运行。

但是,我们看到 not 设置 RETICULATE_PYTHON 遵循通过运行 virtualenv 定义的行为,因此我可能建议在此处将 RETICULATE_PYTHON 设置为诸如位置或基于 miniconda 的 Python 之类的值可执行。我猜这个值可能是./Library/r-miniconda/envs/r-reticulate/bin/python3 或类似的。

如果您不想复制链接的.Rprofile 并根据需要进行修改,您可以将其更改为仅包含此行:

if (Sys.info()[['user']] == 'shiny'){
  Sys.setenv(RETICULATE_PYTHON = "/usr/local/bin/python3")
}

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

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

[1]https://12factor.net

【讨论】:

  • 谢谢你这帮助我更好地理解它。对于任何阅读但不确定如何在 .Rprofile 中编辑的人,他们只需输入代码file.edit(".Rprofile") # edit project specific .Rprofile,它就会出现在 Rstudio 中。他们可以简单地从教程链接中复制并粘贴相同的 .Rprofile,在顶部建议编辑的地方命名应用程序,然后重新部署。
猜你喜欢
  • 2018-09-26
  • 1970-01-01
  • 2018-05-24
  • 2016-02-24
  • 2014-08-09
  • 1970-01-01
  • 2018-07-09
  • 2018-02-03
相关资源
最近更新 更多