在Heroku上使用matplotlib和rpy2以及多个buildpack

时间:2014-02-17 15:20:50

标签: python r heroku matplotlib rpy2

我正在尝试使用这两个buildpack在Heroku上使用多buildpack设置:

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使用这个设置,我收到一个错误。

我使用matplotlib == 1.1.0,正如this StackOverflow post所建议的那样。

但是,当我设置了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过程对于这种事情非常混乱。

1 个答案:

答案 0 :(得分:0)

好的,我明白了。事实证明,正确的库毕竟不在/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