在网状结构中动态更改conda环境

时间:2019-01-18 15:22:57

标签: r 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的模块

1 个答案:

答案 0 :(得分:1)

您正面临问题,因为reticulate不能在单个R会话中不能更改python解释器。您得到ModuleNotFoundError: No module named pack2的原因是reticulate仍在使用env1,而pack2没有use_condaenv(condaenv='env1', conda='/path/to/conda') use_condaenv(condaenv='env2', conda='/path/to/conda', required = TRUE) # should throw an error 。尝试:

callr

作为解决方法,您可以使用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)) 包来运行python代码,就像在独立的R会话中运行一样:

env1

您应该能够在单个会话中为pack1的{​​{1}}和env2的{​​{1}}运行此代码。

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