【问题标题】:Django fails to find R when loading RPy2 under virtualenvDjango 在 vi​​rtualenv 下加载 RPy2 时找不到 R
【发布时间】:2013-09-13 11:32:19
【问题描述】:

这有点令人困惑,提前道歉。我正在使用以下规格配置一个新的(临时)内部生产网络服务器:

OSX 10.8.4 (Mountain Lion)、Apache 2.2.25、PostgreSQL 9.2、Python 2.7.5、Django 1.5.2、R 3.0.1、RPy2 2.3.7、virtualenv 1.10.4、virtualenvwrapper 4.1.1、 mod_wsgi 3.4

这是在使用 Homebrew 和 pip 的新机器上设置的。在安装之前,我删除了 Apple 安装的 Apache 和 Postgres 的原始版本。 Apache 和 mod_wsgi 都可以工作。安装 mod_wsgi 作为守护进程运行。

在 Apache 中配置虚拟主机通过 mod_wsgi 访问 django,wsgi.py 文件包含以下几行:

import os,sys,site
site.addsitedir('/Users/kaiju/.virtualenvs/nauru_dev/lib/python2.7/site-packages')

# Activate the virtual environment
# Taken from http://thecodeship.com/deployment/deploy-django-apache-virtualenv-and-mod_wsgi/
activate_env = os.path.expanduser('/Users/kaiju/.virtualenvs/nauru_dev/bin/activate_this.py')
execfile(activate_env,dict(__file__=activate_env))

所有 python 包(包括 django 和 RPy2)都已使用虚拟环境的 python 站点包安装。

R 是使用 Homebrew 安装的,并且在虚拟环境中调用时可以从命令行或 python 解释器正常工作(大多数情况下,稍后会更多)。

homebrew.mxcl.httpd.plist 已添加到 /Library/LaunchDaemons 而不是 ~/Library/LaunchAgents,以便在机器重新启动时自动启动。 homebrew.mxcl.postgres.plist 已添加到 ~/Library/LaunchAgents(可能也应该将其移动到 /Library/LaunchDaemons)。

所以问题来了。安装完所有东西后,它可以正常工作。为了验证一切正常,我重新启动了机器并测试了 django 应用程序。 Apache 正在运行,django 也是如此,但现在我收到以下错误:

RuntimeError at /admin/
R_HOME not defined, and no R command in the PATH.
     Request Method:    GET
        Request URL:    http://nauru.xoma.com/admin/
     Django Version:    1.5.2
     Exception Type:    RuntimeError
    Exception Value:    R_HOME not defined, and no R command in the PATH.
    Exception Location: /Users/kaiju/.virtualenvs/nauru_dev/lib/python2.7/site-packages/rpy2/rinterface/__init__.py in <module>, line 48
  Python Executable:    /usr/local/opt/python/bin/python2.7
     Python Version:    2.7.5
        Python Path:    ['usr/local/var/django/code/ri',
                         '/usr/local/var/django/code',
                         '/usr/local/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/setuptools-0.9.8-py2.7.egg',
                         '/usr/local/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pip-1.4-py2.7.egg',
                         '/usr/local/Frameworks/Python.framework/Versions/2.7/lib/python27.zip',
                         '/usr/local/Frameworks/Python.framework/Versions/2.7/lib/python2.7',
                         '/usr/local/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin',
                         '/usr/local/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac',
                         '/usr/local/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages',
                         '/usr/local/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk',
                         '/usr/local/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old',
                         '/usr/local/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload',
                         '/usr/local/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages',
                         '/Library/Python/2.7/site-packages',
                         '/Users/kaiju/.virtualenvs/nauru_dev/lib/python2.7/site-packages',
                         '/Users/kaiju/.virtualenvs/nauru_dev/lib/python2.7/site-packages/PIL']

但是如果我打开一个终端窗口并输入

sudo apachectl stop
sudo apachectl start

当服务器恢复时,一切正常。如果我使用sudo apachectl restart,则不会发生这种情况,在这种情况下,错误仍然存​​在。到底是怎么回事?我的活动部件太多了。

【问题讨论】:

  • 尝试将 sys.path.append(path_to_r_installation) 添加到您的 settings.py 文件中。
  • 感谢您的建议。我通过添加sys.path.append('/usr/local/Cellar/R/3.0.1/bin')sys.path.append('/usr/local/Cellar/R/3.0.1/R.framework') 进行了尝试,但对重启后的行为都没有影响。

标签: python django osx-mountain-lion virtualenv rpy2


【解决方案1】:

解决此问题的最佳方法是添加

os.environ['R_HOME']='/usr/local/Cellar/r/3.0.1/R.framework/Resources'

到用于 mod_wsgi / django 的 wsgi.py 文件的开头。它应该在激活虚拟环境之前添加。还应在此处添加任何其他环境变量。所以现在 wsgi.py 文件看起来像这样:

import os,sys,site
os.environ["R_HOME"]='/usr/local/Cellar/r/3.0.1/R.framework/Resources'
site.addsitedir('/Users/kaiju/.virtualenvs/nauru_dev/lib/python2.7/site-packages')

# Activate the virtual environment
# Taken from http://thecodeship.com/deployment/deploy-django-apache-virtualenv-and-mod_wsgi/
activate_env = os.path.expanduser('/Users/kaiju/.virtualenvs/nauru_dev/bin/activate_this.py')
execfile(activate_env,dict(__file__=activate_env))

sys.path.insert(0,'/usr/local/var/django/code')
sys.path.insert(0,'/usr/local/var/django/code/ri')

# We defer to a DJANGO_SETTINGS_MODULE already in the environment. This breaks
# if running multiple sites in the same mod_wsgi process. To fix this, use
# mod_wsgi daemon mode with each site in its own daemon process, or use
# os.environ["DJANGO_SETTINGS_MODULE"] = "ri.settings"
os.environ.setdefault("DJANGO_SETTINGS_MODULE","ri.settings")

# This application object is used by any WSGI server configured to use this
# file. This includes Django's development server, if the WSGI_APPLICATION
# setting points here.
from django.core.wsgi import get_wsgi_application
application = get_wsgi_application()

非常感谢为本次讨论做出贡献的人!

【讨论】:

    【解决方案2】:

    我认为sys.path 与环境变量 PATH 关系不大,应该设置它(如果需要,还需要设置LD_LIBRARY_PATH)。

    我猜 Apache 正在以专用用户身份运行(出于明显的安全原因,不是您自己的 UID),并且该用户的路径中没有 R(其他安全步骤 - 默认情况下,Apache 不应该能够运行任何在您的系统上可执行)。

    您必须允许 Apache 运行系统的 R,或者只为您的服务器安装 R(如果考虑使用原型之外的任何东西,则后者更好)

    【讨论】:

    • 是的,Apache 是一个专用服务器。 R.framework 位置具有通用执行权限drwxrwxr-x 8 kaiju admin 272 Sep 6 15:42 R.framework,所以我很确定 Apache 应该能够运行它。我尝试在.bash_profile 中为用户实际导出一个R_HOME 变量,但R 实际上抱怨它并没有解决问题,所以我把它拿出来了。也许我不太明白你在说什么。
    • 啊。然后可能是其他类似的东西......这个:stackoverflow.com/questions/8309465/…(显然仍然没有修复:bugs.python.org/issue13156
    • 也许吧。为了以防万一,我将WSGIApplicationGroup 添加到vhosts 文件中,但这并不能解决问题。我的python版本是2.7.5,所以这个bug已经解决了,除非它以某种方式复活。 --谢谢!
    • 您必须弄清楚为什么以下返回值 0:bitbucket.org/lgautier/rpy2/src/…。不过,这似乎不是 rpy2 特有的问题。
    • 我相信你可能是对的,这不是一个 rpy2 问题。但是,我们可以通过将 os.environ["R_HOME"]='/usr/local/Cellar/r/3.0.1/R.framework/Resources' 添加到 rpy2 __init__.py 文件中来运行。我认识到这不是一个合适的解决方案,只是一个创可贴。似乎更好的解决方案应该在于 mod_wsgi 或 virtualenv 配置,只是不知道在哪里
    猜你喜欢
    • 1970-01-01
    • 2016-04-03
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 2021-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多