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

2023-12-04

我有一个应用程序想要部署在shinyapps.io 上。我认为值得注意的是,应用程序中的数据是从 athena 的数据库中提取的。我用了这个包Rathena连接到数据库以及所有用于从我的计算机本地运行良好的内容。但是,我尝试将其部署到shinyapps.io 上,但收到一条消息,指出发生了错误。我只是在部署后弹出的窗口中看到了这一点。我查看了shinyapps.io 的日志部分,看到这样的消息:

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

我从未使用过 .Rprofile,而且我不知道 RETICULATE_PYTHON 是什么意思。无论如何,他们在堆栈溢出上说谷歌是你最好的朋友。我在 Github 上找到了这个教程,名为教程:使用 Shiny + reticulate 使用 R 和 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 请使用以下任一方法安装 boto3:pip install boto3 numpy在终端或install_boto()。 如果这不起作用,请设置您正在使用的 pythonreticulate::use_python() or reticulate::use_condaenv()

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

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

我感觉我在这里兜圈子。


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

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

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

我还没有测试过这个解决方案,但我认为修复实际上在您的链接中!查看https://github.com/ranikay/shiny-reticulate-app/blob/master/.Rprofile看看它们如何包含比简单的值分配更多的内容RETICULATE_PYTHON并实际使用条件语句根据结果设置各种值(Sys.info()[['user']].

的价值(Sys.info()[['user']]根据 R 是否执行而有所不同.Rprofile在本地计算机上与虚拟计算机上shinyapps.io 运行您的 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,它显然在名为的用户下运行你的 Shiny 应用程序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

根据您上面的描述以及我在链接教程,我想你几乎可以复制整个.Rprofile他们已经将其添加到您的项目中,并且可能只需要进行一两个小的修改,您应该就可以让您的 Shiny 应用程序在本地和闪亮的应用程序上运行reticulate.

然而,我们看到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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

由于 reticulate_python 导致闪亮应用程序部署出现问题 的相关文章

随机推荐