我正在使用'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中的错误(“import nltk”):没有名为nltk的模块
虽然它存在于我的虚拟环境中。
我在Ubuntu 13.04上使用R 3.0.2,Python 2.7.4。
另外,我知道我可以使用
从R中更改python库路径python.exec("sys.path='\your\path'")
但是我不想在安装新的python包时一遍又一遍地手动输入。
提前致谢!
答案 0 :(得分:1)
在运行R之前使用“activate”bash脚本,以便R进程继承更改的环境变量。
$ source myvirtualenv/bin/activate
$ R
现在rPython应该能够使用你的virtualenv中的包。
适合我。如果你使用的virtualenv的Python版本与r进程中的一个rPython链接不同,可能会表现得很奇怪。
答案 1 :(得分:1)
扩展@PaulHarrison的答案,您可以模仿.../activate
在环境中的直接作用(在从R启动python之前)。
这是一种确定要修改哪些var的方法:
$ 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
因此看来,要更新的重要envvar是:
PATH
:在venv bin目录之前添加到现有路径VIRTUAL_ENV
:设置为/path/to/venv
我相信其他更改(OLD_VIRTUAL_*
和deactivate () ...
)是可选的,并且实际上仅用于取消venv激活。
查看.../activate
脚本可验证以下是大多数步骤。如果已设置,则未设置PYTHONHOME
,如果您之前没有设置过,则可能不会显示在上面的差异中。
要对此进行调整:
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
答案 2 :(得分:0)
我很幸运使用以下方法来获取脚本以使用我的peynv安装:
#!/usr/bin/env python
所以也许尝试将R指向该路径(当然没有#!
。)
答案 3 :(得分:0)
使用bash -c
进行管理:
system("/bin/bash -c \"source ./pydatatable/py-pydatatable/bin/activate && python -c 'import datatable as dt; print(dt.__version__)'\"")