1

是否可以通过 reticulate 动态改变 conda 环境?

use_condaenv(condaenv='env1', conda='/path/to/conda')
package1 = import('pack1')
package1$do_smth

use_condaenv(condaenv='env2', conda='/path/to/conda')
package2 = import('pack2')
package2$do_smth2

目前我在这里收到一个导入错误:

package2 = import('pack2')

ModuleNotFoundError:没有名为 pack2 的模块

4

1 回答 1

1

您正面临问题,因为reticulate无法在单个 R 会话中更改 python 解释器你得到ModuleNotFoundError: No module named pack2是因为reticulate仍在使用env1which 没有pack2. 试试看:

use_condaenv(condaenv='env1', conda='/path/to/conda')
use_condaenv(condaenv='env2', conda='/path/to/conda', required = TRUE) # should throw an error

作为一种解决方法,您可以做的是使用callr包来运行 python 代码,就好像它会在独立的 R 会话中运行一样:

library(callr)

# change variables accordindly:
venv <- "env2" # env1 or env2

# (optional) a python script containing a function which you would like to run from R
python_script_path <- "some_python_script.py"
# (optional)
some_other_parameter <- "foobar"

result <- r(function(venv, python_script_path, some_other_parameter){
    library(reticulate)
    use_condaenv(venv, conda='/path/to/conda', required = T)

    # try to import package
    package = import('pack2') # pack1 or pack2
    return(package$do_smth())

    # (oprional) or even to source a python script
    # source_python(python_script_path)
    # run a python function which is sourced from `python_script_path`
    # result <- run_calculations(some_other_parameter)
    # return(result)
  }, args = list(venv, python_script_path, some_other_parameter))

您应该能够在单个会话中为env1withpack1和 for env2with运行此代码而不会出现问题。pack2

注意:匿名函数将有它自己的环境,为了从全局环境访问变量,您需要将它们作为参数传递给函数(尽管您可能可以传递全局环境本身,但我没有尝试过)。

于 2020-05-12T11:35:45.173 回答