如何让R脚本激活Conda环境env2并调用其中的R包?
解决从Conda环境env1的Python调用env2的R脚本问题
要让R脚本完全使用env2环境下的包,核心是让R运行在env2的Conda环境上下文里,而不是继承父进程(env1)的环境。你当前的直接调用方式会继承env1的环境变量,可能导致R去错误的路径找包,下面是两种可靠的解决方法:
方法一:用conda run调用R脚本
conda run是Conda官方推荐的在指定环境下运行命令的方式,它会自动帮你切换到目标环境并配置好所有必要的环境变量。修改Python脚本中的subprocess调用:
import subprocess # 用-p指定环境路径,或者用-n指定环境名(如果env2已经用conda env create命名过) subprocess.call(['conda', 'run', '-p', '/condaenv/env2', 'Rscript', 'testr.R', 'hello'])
这种方法不需要修改R脚本,conda run会确保R使用env2下的所有依赖,包括R本身和安装的包。
方法二:直接指定env2的Rscript并覆盖环境变量
如果你不想用conda run,可以直接调用env2的Rscript,同时手动设置R的库路径环境变量,强制R从env2的库目录加载包:
import subprocess import os # 复制当前环境变量,然后修改R_LIBS指向env2的R库路径 new_env = os.environ.copy() new_env['R_LIBS'] = '/condaenv/env2/lib/R/library' # 调用env2的Rscript并传入修改后的环境变量 subprocess.call(['/condaenv/env2/bin/Rscript', 'testr.R', 'hello'], env=new_env)
关于你当前R脚本的shebang
你R脚本开头的#!/condaenv/env2/bin/Rscript在直接通过Rscript调用时其实不会生效(因为你是手动指定Rscript路径执行的),但如果是给脚本加可执行权限后直接运行(比如./testr.R),这个shebang会生效。不过结合Python调用的场景,用上面两种方法更稳妥。
验证方法:可以在testr.R里加一行代码打印当前R的库路径,确认是否指向env2:
#!/condaenv/env2/bin/Rscript print(.libPaths()) # 输出应该包含/condaenv/env2/lib/R/library library(Peaks) library(httr)
内容的提问来源于stack exchange,提问作者Susan
相关产品推荐
相关产品推荐

