![](/img/trans.png)
[英]Error running python script in RStudio and shiny app using reticulate
[英]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 numpy
:pip 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可執行文件在計算機上reticulate
似乎確定您的 Python 可執行文件來自RETICULATE_PYTHON
環境變量的位置,但在未設置變量時也有一些默認行為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] 因此,當您在本地構建應用程序並將其部署到其他環境。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.