【问题标题】:using python virtual env in R在 R 中使用 python 虚拟环境
【发布时间】:2013-12-02 20:28:50
【问题描述】:

我正在使用“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 包时一遍又一遍地手动输入。

提前致谢!

【问题讨论】:

    标签: python r virtualenv


    【解决方案1】:

    在运行R之前使用“activate”bash脚本,让R进程继承改变的环境变量

    $ source myvirtualenv/bin/activate
    
    $ R
    

    现在 rPython 应该可以使用你的 virtualenv 中的包了。

    为我工作。如果您创建 virtualenv 所使用的 Python 版本与指向 R 进程的一个 rPython 链接不同,则可能会出现奇怪的行为。

    【讨论】:

    • Rstudio 能做到吗?
    • R 脚本必须使用多个不同的虚拟环境
    【解决方案2】:

    扩展@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_VIRTUAL_*deactivate () ...)是可选的,实际上仅用于退出 venv 激活。

    查看.../activate 脚本可以验证这些是所采取的大部分步骤。另一个步骤是 unset PYTHONHOME if set,如果您之前没有设置它,上面的差异可能不会显示。

    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
    

    【讨论】:

    • 我会坚持我的扩展 bash -c '...' 电话,但您的解决方案似乎是其他所有解决方案中最好的。
    • 我同意……让系统自己进行 envvar 管理通常更安全。 system 方法的唯一缺点是您必须能够手动调用 python(用于 R 交互)。其中一个 python 启用程序有reticulate::use_virtualenv()(排除了这种必要性),不确定其他的。我更喜欢你的简单和原则,尽管我怀疑使用Sys.setenv 这样做通常是足够安全的。
    【解决方案3】:

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

    #!/usr/bin/env python

    所以也许可以尝试将 R 指向该路径(当然,没有#!)。

    【讨论】:

      【解决方案4】:

      使用bash -c 设法让它工作:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-21
        • 2017-10-05
        • 2014-08-08
        • 1970-01-01
        • 1970-01-01
        • 2019-09-24
        • 1970-01-01
        • 2020-09-02
        相关资源
        最近更新 更多