当我尝试将我的(网状结构的)Shiny应用部署到 shinyapps.io,我得到以下错误。
Error in value[[3L]](cond) : invalid version specification ‘20.1b1’
Calls: local ... tryCatch -> tryCatchList -> tryCatchOne -> <Anonymous>
Execution halted
虽然没有明确指出,我想这个错误是指pip的版本,我从来没有明确指出。
这是在ui和server函数之前的那部分代码。
library(reticulate)
library(shiny)
virtualenv_create(envname = "elicit", python="python3")
virtualenv_install("elicit", packages = c('numpy', 'Gpy'))
use_virtualenv("elicit", required = TRUE)
当我把这部分代码和所有与Python相关的代码一起注释出来时,一切都很正常。
我如何设置网站请求的有效版本?我看到 reticulate::virtualenv
拥有 pip_options
参数,但我找不到关于如何使用它的有用文档。
我对设置虚拟环境和conda环境也不是很精通,所以我很可能遗漏了一些基本步骤。
我注意到,如果我切换了顺序的 use_virtualenv
和 virtualenv_install
调用时,我得到了一个不同的错误。
ERROR: The requested version of Python
('~/.virtualenvs/elicit/bin/python') cannot be used, as another version
of Python ('/usr/bin/python3') has already been initialized. Please
restart the R session if you need to attach reticulate to a different
version of Python.
Error in value[[3L]](cond) :
failed to initialize requested version of Python
Calls: local ... tryCatch -> tryCatchList -> tryCatchOne -> <Anonymous>
Execution halted
我试过了所有我能想到的方法,但我也无法解决这个问题。
其实我找到了解决这个问题的方法。由于pip的错误版本在你创建virtualenv时就会被安装,所以我强行卸载了它,然后安装了在我创建应用时能用的版本。这是我使用的代码。
virtualenv_create(envname = "python_environment", python = "python3")
virtualenv_remove(envname = "python_environment", packages = "pip")
virtualenv_install(envname = "python_environment", packages = c("pip==19.0.3","numpy","nltk","torch"), ignore_installed = TRUE)
use_virtualenv("python_environment", required = TRUE)
我把这段代码写成了被接受的答案的注释 但我也把这段代码作为答案贴出来,以便更好地了解和进一步解释
对我的情况来说,最后起作用的是创建了个 .Rprofile
文件,其中包含以下一行。
Sys.setenv(RETICULATE_PYTHON = "~/.virtualenvs/elicit/bin/python3")
该文件应位于与以下文件相同的文件夹中 app.R
并应部署到远程服务器。最后的 app.R
文件和问题中发布的一样。
更新了。 最终这个文件又坏了,我的解决方法是删除并重新安装pip(正如theThalamus所指出的),但不指定pip版本。所以 app.R
会是这样的。
virtualenv_create(...) # create virtual environment
virtualenv_remove(envname = "python_environment", packages = "pip")
virtualenv_install(envname = "python_environment", packages = "pip")
virtualenv_install(...) # install other packages
这两个 virtualenv_install
实例可能会被合并,但我决定将它们分开来强调修复。