首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >由于reticulate_python而导致的闪亮应用程序的部署问题

由于reticulate_python而导致的闪亮应用程序的部署问题
EN

Stack Overflow用户
提问于 2020-10-06 07:32:05
回答 1查看 1.7K关注 0票数 2

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

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

我从未使用过.Rprofile,也不知道RETICULATE_PYTHON是什么意思。不管怎么说,他们说在堆栈溢出谷歌是你最好的朋友。我在Github上找到了一个叫做教程:使用闪亮+网络创建R和Python3的应用程序的教程。我按照它说的做了最初的步骤,最后说:

确认.Rprofile文件包含在项目的目录中,并与server.R和ui.R一起部署到shinyapps.io中。这个文件设置了RETICULATE_PYTHON环境变量,它告诉网络在shinyapps.io服务器上定位的位置。

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

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

错误:未检测到Boto3,请在终端或install_boto()中使用:pip install boto3 numpy安装boto3。如果这不起作用,请设置与reticulate::use_python()reticulate::use_condaenv()一起使用的python

这是没有意义的,因为我已经安装了boto3,甚至在终端中也是如此。

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

我觉得我要在这里绕圈。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-09 06:20:18

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

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

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

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

(Sys.info()[['user']]的值取决于R是在本地计算机上执行.Rprofile,还是虚拟计算机shinyapps.io运行您闪亮的应用程序,链接.Rprofile是根据R在本地计算机上运行还是在另一台计算机上运行来设置各种值。所有这些都能工作,因为shinyapps.io

从.Rprofile中的代码可以看出,shinyapps.io在名为“闪亮”的用户下运行您闪亮的应用程序,

代码语言:javascript
复制
if (Sys.info()[['user']] == 'shiny'){
  Sys.setenv(RETICULATE_PYTHON = paste0('/home/shiny/.virtualenvs/', VIRTUALENV_NAME, '/bin/python'))
}

他们甚至在他们的“支持RStudio连接”中添加了一个条件块,这显然是在名为rstudio-connect的用户下运行您闪亮的应用程序,而不是“闪亮”:

代码语言:javascript
复制
} else if (Sys.info()[['user']] == 'rstudio-connect'){
  Sys.setenv(RETICULATE_PYTHON = paste0(VIRTUALENV_NAME, '/bin/python'))
}

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

代码语言:javascript
复制
} else {
  # RETICULATE_PYTHON is not required locally, RStudio infers it based on the ~/.virtualenvs path

从上面所描述的以及我在链接教程上看到的情况来看,我认为您几乎可以将他们拥有的整个.Rprofile复制到您的项目中,并且,只要进行一两次小小的修改,您就应该能够在本地运行您闪亮的应用程序,并在shinyapps.io和reticulate上运行。

但是,我们看到,不设置RETICULATE_PYTHON会遵从通过运行虚拟not定义的行为,因此我可能建议在这里将RETICULATE_PYTHON设置为一个值,比如位置或基于迷你值的Python可执行文件。我猜这个值可能是./Library/r-miniconda/envs/r-reticulate/bin/python3或类似的。

如果您不想复制链接的.Rprofile并根据需要对其进行修改,则只需将您的代码更改为只包含以下一行:

代码语言:javascript
复制
if (Sys.info()[['user']] == 'shiny'){
  Sys.setenv(RETICULATE_PYTHON = "/usr/local/bin/python3")
}

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

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

1

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64221199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档