gpt4 book ai didi

python - 由于 reticulate_python,部署 shiny 应用程序时出现问题

转载 作者:行者123 更新时间:2023-12-02 16:27:12 32 4
gpt4 key购买 nike

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

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

我从未使用过 .Rprofile,我不知道 RETICULATE_PYTHON 是什么意思。不管怎样,他们在 stack overflow 上说谷歌是你最好的 friend 。我在 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)

我觉得我在这里兜圈子。

最佳答案

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

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

  • 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()[[ '用户']].

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

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

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

他们甚至在其中添加了一个条件 block 来支持 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 复制到你的项目中,并且可能只需要一两个小的修改,你应该能够让你的 Shiny 应用程序在本地和 shinyapps 上运行。 io 与 reticulate

但是,我们看到 设置 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

关于python - 由于 reticulate_python,部署 shiny 应用程序时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64221199/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com