繁体   English   中英

由于 reticulate_python 部署闪亮应用程序的问题

[英]Problems with deployment of shiny app due to reticulate_python

我有一个应用程序,我想在 Shinyapps.io 上部署。 我认为重要的是要注意应用程序中的数据是从 athena 中的数据库中提取的。 我使用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 环境变量,它告诉 reticulate 在 Shinyapps.io 服务器上找到 Python 虚拟环境的位置。

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

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

错误:未检测到 Boto3 请使用以下任一方法pip install boto3 numpypip install boto3 numpy in terminal 或install_boto() 如果这不起作用,请使用reticulate::use_python()reticulate::use_condaenv()设置您正在使用的 python

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

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

我觉得我在这里兜了一圈。

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

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

  • reticulate需要知道你的Python可执行文件在计算机上
  • Python 可执行文件的 locatl 在您的计算机和虚拟计算机 Shinyapps.io 之间不同
  • 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在您的本地计算机上执行.Rprofile在虚拟计算机 Shinyapps.io 上运行您的 Shiny 应用程序以及链接的.Rprofile正在执行工作而.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

根据您上面的描述以及我在链接教程中看到的内容,我认为您几乎可以将他们拥有的整个.Rprofile复制到您的项目中,并且可能只需要一两个小的修改,您就应该能够获得您的在本地和 Shinyapps.io 上使用reticulate运行的 Shiny 应用程序。

然而,我们看到,没有设置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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM