【问题标题】:Using both matplotlib and rpy2 with multi-buildpacks on Heroku在 Heroku 上将 matplotlib 和 rpy2 与多构建包一起使用
【发布时间】:2014-03-16 23:15:29
【问题描述】:

我正在尝试通过这两个构建包在 Heroku 上使用多构建包设置:

https://github.com/virtualstaticvoid/heroku-buildpack-r.git
https://github.com/dbrgn/heroku-buildpack-python-sklearn/

我正在使用 rpy2 从 python 调用 R。 I detailed the full process I used to get the slug to compile here.

它适用于带有 rpy2 的 numpy、scipy 和 scikit-learn。但是,我也试图让 matplotlib 使用这个设置,但我遇到了一个错误。

按照this StackOverflow post 的建议,我使用了 matplotlib==1.1.0。

但是,当我设置了 LD_LIBRARY_PATH 以便 rpy2 可以正常工作时,如下所示:

LD_LIBRARY_PATH=/app/vendor/R/lib64/R/modules:/app/vendor/R/lib64/R/lib:/app/vendor/gcc-4.3/lib64

我收到此错误:

>>> from matplotlib import ft2font
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: /app/vendor/R/lib64/R/lib/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by /app/.heroku/python/lib/python2.7/site-packages/matplotlib/ft2font.so)

如果我删除 LD_LIBRARY_PATH 设置,那么 matplotlib 可以工作,但 rpy2 找不到位于 /app/vendor/R/lib64/R/lib 中的 R 库。出于某种原因,更改 LD_LIBRARY_PATH 中目录的顺序似乎没有效果。

所以我可以让 matplotlib 或 rpy2 工作,但不能同时工作。

我在这些位置有图书馆:

~ $ find . -name "*libstd*"   
/app/vendor/gcc-4.3/gcc-4.3/lib64/libstdc++.so.6.0.10
/app/vendor/gcc-4.3/gcc-4.3/lib64/libstdc++.so.6
/app/vendor/gcc-4.3/gcc-4.3/lib64/libstdc++.so
/app/vendor/gcc-4.3/gcc-4.3/lib64/libstdc++.a
/app/vendor/gcc-4.3/gcc-4.3/lib64/libstdc++.la
/app/vendor/gcc-4.3/gcc-4.3/lib/libstdc++.so.6.0.10
/app/vendor/gcc-4.3/gcc-4.3/lib/libstdc++.so.6
/app/vendor/gcc-4.3/gcc-4.3/lib/libstdc++.so
/app/vendor/gcc-4.3/gcc-4.3/lib/libstdc++.a
/app/vendor/gcc-4.3/gcc-4.3/lib/libstdc++.la
/app/vendor/R/lib64/R/lib/libstdc++.so.6.0.10
/app/vendor/R/lib64/R/lib/libstdc++.so.6
/app/vendor/R/lib64/R/lib/libstdc++.so
/app/vendor/R/lib64/R/lib/libstdc++.a
/app/vendor/R/lib64/R/lib/libstdc++.la

我怀疑 matplotlib 应该使用 /app/vendor/gcc-4.3/gcc-4.3/lib64/libstdc++.so.6 (我怎么知道?),但我似乎无法让它使用它一个。

有什么建议吗?我完全被困住了。我必须说多 buildpack 过程对于这种事情非常混乱。

【问题讨论】:

    标签: python r heroku matplotlib rpy2


    【解决方案1】:

    好的,我想通了。事实证明,正确的库毕竟不在 /app/vendor/gcc-4.3/gcc-4.3/lib64/ 中,而只是在 /usr/lib 中。这就解释了为什么更改 LD_LIBRARY_PATH 中目录的顺序没有效果,因为它不在其中任何一个中。

    必须有一些逻辑在 LD_LIBRARY_PATH 的目录中查找,但在那里找不到匹配项,然后在 /usr/lib 中查找。这就是为什么它有时会起作用。 /app/vendor/R/lib64/R/lib/ 中的文件必须足够接近才能被视为匹配(因此它没有在 /usr/lib 中查找),但格式错误,因此导致稍后错误。

    解决方法是在 LD_LIBRARY_PATH 中包含 /usr/lib。我也添加了 /usr/local/lib ,这是一个很好的衡量标准。您现在应该使用:

    heroku config:set LD_LIBRARY_PATH=/usr/lib:/usr/local/lib:/app/vendor/R/lib64/R/modules:/app/vendor/R/lib64/R/lib:/app/vendor/gcc-4.3/lib64

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-23
      • 2013-02-10
      • 2019-03-14
      • 2022-08-06
      • 1970-01-01
      • 2016-07-28
      • 2015-08-17
      • 2013-04-21
      相关资源
      最近更新 更多