在R中使用python虚拟环境

在R中使用python虚拟环境,python,r,virtualenv,Python,R,Virtualenv,我使用“rPython”包在R中调用python,但我无法使R引用python的虚拟环境 在R中,我尝试使用 system('. /home/username/Documents/myenv/env/bin/activate') 但是在运行上述程序之后,我的python库路径没有改变(我通过python.exec(print sys.path)检查)。当我跑的时候 python.exec('import nltk') 我被抛出错误: python.exec(“导入nltk”)中出错:没有名为

我使用“rPython”包在R中调用python,但我无法使R引用python的虚拟环境

在R中,我尝试使用

system('. /home/username/Documents/myenv/env/bin/activate')
但是在运行上述程序之后,我的python库路径没有改变(我通过
python.exec(print sys.path)
检查)。当我跑的时候

python.exec('import nltk')
我被抛出错误:

python.exec(“导入nltk”)中出错:没有名为nltk的模块

虽然它在我的虚拟环境中

我在Ubuntu13.04上使用R3.0.2和Python2.7.4

另外,我知道我可以使用

python.exec("sys.path='\your\path'")
但我不希望在安装新的python包时一次又一次地手动输入


提前谢谢

我很幸运地通过以下方式获得了使用peynv安装的脚本:

#/usr/bin/env python

因此,可以尝试将R指向该路径(当然是sans

在运行R之前使用“激活”bash脚本,以便R进程继承更改的环境变量

$ source myvirtualenv/bin/activate

$ R
现在rPython应该能够使用virtualenv中的包了


对我有用。如果您制作virtualenv时使用的Python版本与rPython链接到R进程的版本不同,则可能会出现异常行为。

请使用
bash-c

system("/bin/bash -c \"source ./pydatatable/py-pydatatable/bin/activate && python -c 'import datatable as dt; print(dt.__version__)'\"")

通过扩展@PaulHarrison的答案,您可以直接模拟
../activate
在环境中所做的事情(在从R启动python之前)

这里有一种确定修改哪些变量的方法:

$ set > pyenv-pre
$ . /path/to/venv/activate
(venvname) $ set > pyenv-post
(venvname) $ diff -uw pyenv-pre pyenv-post
这让我感觉到:

--- pyenv-pre 2018-12-02 15:16:43.093203865 -0800
+++ pyenv-post 2018-12-02 15:17:34.084999718 -0800
@@ -33,10 +33,10 @@
 OPTERR=1
 OPTIND=1
 OSTYPE=linux-gnu
-PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
+PATH=/path/to/venv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
 PIPESTATUS=([0]="0")
 PPID=325990
-PS1='\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
+PS1='(venvname) \[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
 PS2='> '
 PS4='+ '
 PWD=/
@@ -50,10 +50,13 @@
 TERM=xterm
 UID=3000019
 USER='helloworld'
+VIRTUAL_ENV=/path/to/venv
 XDG_DATA_DIRS=/usr/local/share:/usr/share:/var/lib/snapd/desktop
 XDG_RUNTIME_DIR=/run/user/3000019
 XDG_SESSION_ID=27577
-_=set
+_=/path/to/venv/bin/activate
+_OLD_VIRTUAL_PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
+_OLD_VIRTUAL_PS1='\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
 __git_printf_supports_v=yes
 __grub_script_check_program=grub-script-check
 _backup_glob='@(#*#|*@(~|.@(bak|orig|rej|swp|dpkg*|rpm@(orig|new|save))))'
@@ -2390,6 +2393,31 @@
         fi;
     fi
 }
+deactivate () ... rest of this function snipped for brevity
因此,需要更新的重要环境变量如下:

  • PATH
    :将venv bin目录前置到现有路径
  • VIRTUAL_ENV
    :设置为
    /path/to/venv
我认为其他更改(
OLD\u VIRTUAL.*
deactivate()…
)是可选的,实际上只用于退出venv激活

查看
../activate
脚本可以验证这些是所采取的大多数步骤。另一个步骤是取消设置PYTHONHOMEif set,如果您之前没有设置它,它可能不会显示在上面的diff中

要对此进行R-ize,请执行以下操作:

Sys.setenv(
  PATH = paste("/path/to/venv/bin", Sys.getenv("PATH"), sep = .Platform$path.sep),
  VIRTUAL_ENV = "/path/to/venv"
)
Sys.unsetenv("PYTHONHOME") # works whether previously set or not

你能为Rstudio做这件事吗?R脚本必须使用多个不同的虚拟环境。我将坚持使用扩展的
bash-c'…'
调用,但你的解决方案似乎是所有其他解决方案中最好的。我同意。。。一般来说,让系统自己进行envvar管理更安全。
system
方法的唯一缺点是必须能够手动调用
python
(对于R交互)。其中一个python使能器具有
networkite::use_virtualenv()
(这就排除了这种必要性),但对其他使能器不太清楚。出于简单性和原则性的考虑,我更喜欢您的,尽管我怀疑使用
Sys.setenv
通常足够安全。