由于 reticulate_python,闪亮应用程序部署出现问题

Problems with deployment of shiny app due to reticulate_python

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

警告:使用网状但未指定 python;将在 /usr/bin/python3 处使用 python 发布前是否忘记在 .Rprofile 中设置 RETICULATE_PYTHON 环境变量?

我从未使用过 .Rprofile,我不知道 RETICULATE_PYTHON 是什么意思。不管怎样,他们在堆栈溢出时说 google 是你最好的朋友。我在 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 文件中。我这样做了,现在当我尝试 运行 在我的计算机上本地应用程序时,我收到错误消息:

Error: Boto3 is not detected please install boto3 using either: pip install boto3 numpy in terminal or install_boto(). If this doesn't work please set the python you are using with reticulate::use_python() or reticulate::use_condaenv()

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

Requirement already satisfied: boto3 in ./Library/r-miniconda/envs/r-reticulate/lib/python3.6/site-packages (1.14.28)

我觉得我在兜圈子

对于 运行 本地软件和 运行 另一个环境中的软件,这实际上是一个相当烦人的问题,我想解决方案通常是 non-obvious。您可能不是第一个 运行 参与其中的人。

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

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

我还没有测试过这个解决方案,但我认为修复实际上在你的 link 中!查看 https://github.com/ranikay/shiny-reticulate-app/blob/master/.Rprofile 并了解它们如何包含不仅仅是对 RETICULATE_PYTHON 的简单赋值以及实际使用条件语句根据 (Sys.info()[['user']] 的结果设置各种值。

(Sys.info()[['user']] 的值将根据 R 是在本地计算机上执行 .Rprofile 还是在虚拟计算机 shinyapps.io 运行 上执行您的 Shiny 应用程序和linked .Rprofile 正在根据 R 是否在您的本地计算机或另一台计算机上 运行ning 来设置各种值。这一切都有效,因为 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 而不是“闪亮”的用户下使用您的闪亮应用程序:

} 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 复制到你的项目中,也许只需要一点点修改一两个,你应该能够在本地和 shinyapps.io 上使用 reticulate.

获取你的 Shiny 应用程序 运行ning

但是,我们看到 不是 设置 RETICULATE_PYTHON 遵从 运行 虚拟环境定义的行为,所以我可能建议设置 RETICULATE_PYTHON这里是一个值,例如位置或您的 miniconda-based Python 可执行文件。我猜该值可能是 ./Library/r-miniconda/envs/r-reticulate/bin/python3 或类似值。

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

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

然后尝试运行本地部署。

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

[1] https://12factor.net