27

我在 Heroku 上运行了 Numpy 和 Matplotlib,我也在尝试安装 Scipy。但是,Scipy 需要安装 BLAS[1],这在 Heroku 平台上没有提供。在联系 Heroku 支持后,他们建议我将 BLAS 构建为静态库以进行部署,并设置必要的环境变量。

因此,我在 64 位 Linux 机器上编译了 libblas.a,并按照 [2] 中的描述设置了以下变量:

$ heroku config
BLAS             => .heroku/vendor/lib/libfblas.a
LD_LIBRARY_PATH  => .heroku/vendor/lib
LIBRARY_PATH     => .heroku/vendor/lib
PATH             => bin:/usr/local/bin:/usr/bin:/bin
PYTHONUNBUFFERED => true

在我的 requirements.txt 中添加 scipy==0.10.1 后,推送仍然失败。

     File "scipy/integrate/setup.py", line 10, in configuration

       blas_opt = get_info('blas_opt',notfound_action=2)

     File "/tmp/build_h5l5y31i49e8/lib/python2.7/site-packages/numpy/distutils/system_info.py", line 311, in get_info

       return cl().get_info(notfound_action)

     File "/tmp/build_h5l5y31i49e8/lib/python2.7/site-packages/numpy/distutils/system_info.py", line 462, in get_info

       raise self.notfounderror(self.notfounderror.__doc__)

   numpy.distutils.system_info.BlasNotFoundError:

       Blas (http://www.netlib.org/blas/) libraries not found.

       Directories to search for the libraries can be specified in the

       numpy/distutils/site.cfg file (section [blas]) or by setting

       the BLAS environment variable.

似乎 pip 不知道 BLAS 环境变量,所以我使用 heroku run python 检查环境:

(venv)bash-3.2$ heroku run python
Running python attached to terminal... import up, run.1
Python 2.7.2 (default, Oct 31 2011, 16:22:04) 
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.system('bash')
~ $ echo $BLAS
.heroku/vendor/lib/libfblas.a
~ $ ls .heroku/vendor/lib/libfblas.a
.heroku/vendor/lib/libfblas.a
~ $ 

而且看起来还不错。现在我不知道如何解决这个问题。

[1] http://www.netlib.org/blas/ [2] http://www.scipy.org/Installing_SciPy/Linux

4

6 回答 6

15

我设法通过将 numpy 和 scipy 离线构建为 bdists,然后修改 heroku python buildpack 以将它们直接解压缩到 dyno 的供应商/venv 区域,从而在 cedar 堆栈上工作。您还可以使用 buildpack 设置持久的环境变量。

Heroku 尚未正式发布构建包 - 搜索“heroku buildpacks”以获取更多第三方/heroku 构建包和信息。

我的 python 构建包分支在这里: https://wyn@github.com/wyn/heroku-buildpack-python.git

更改在 bin/compile 中,我在其中获取了两个新步骤,一个 scipy/numpy 步骤和一个 openopt 步骤。这两个步骤的脚本位于 bin/steps/npscipy 和 bin/steps/openopt 中。我还在 bin/release 中添加了一些变量。请注意,我假设通过 setup.py 文件而不是 requirements.txt 方法进行安装(参见https://devcenter.heroku.com/articles/python-pip#traditional_distributions)。

我还下载了用于在 dyno 上构建 numpy/scipy 的 blas/lapack/atlas/gfortran 二进制文件,因为有 c 扩展需要链接到它们。离线构建和下载所有内容的原因是 pip 安装 numpy/scipy 需要你有一个 fortran 编译器 + 相关的开发环境,这让我的 slug 太大了。

它似乎工作了,slug 大小现在是 35mb,而且缩放似乎也很快。除一项 numpy 测试外,所有测试均通过,并且所有 scipy 测试均通过。

这对我来说仍在进行中,但我想我会分享。

于 2012-05-17T08:33:22.933 回答
9

万一其他人像我一样遇到这种情况......

遗憾的是, @coshx对这个问题的出色回答不再有效(至少我无法让它工作)。然而,我所做的是:

  1. 我从@coshx 分叉了 npsicpy-binaries存储库并更改了所有 tar 文件,使得它们没有venv作为里面的根文件夹(我的叉子在这里

  2. 我从@coshx 分叉了npsp-helloworld存储库,并使其使用requirements.txt文件而不是 setup.py (我的分叉在这里- 这意味着您可以使用整个 pip 方法)。

  3. 我从 Heroku 分叉了heroku-buildpack-python存储库,从@coshx 获取了npscipy文件并将其更改为使用最新版本的构建包(我的 fork 在这里- 你可以看到没有设置 venv,因为例子)。

完成这三件事后,我的npsp-helloworld应用程序运行良好。您只需要确保在创建应用程序时正确设置 buildpack 即可:

$ heroku create --stack=cedar --buildpack=https://github.com/kmp1/heroku-buildpack-python.git

注意:我还没有弄清楚如何制作我自己的二进制文件,所以这三个库(scipy、numpy 和 scikit-learn)不是最新版本,所以请确保在安装它时你会这样做(如果有人可以构建这些我很乐意接受他们的拉取请求):

pip install scipy==0.11.0
pip install numpy==1.7.0
pip install scikit-learn==0.13.1

顺便说一句 - 如果我没有以正确的方式做事,我真的很抱歉,礼仪方面。我还在学习 git 和整个开源的东西。

于 2013-09-22T20:25:23.317 回答
8

另一个不错的选择是conda buildpack,它允许您将通过 Anaconda/Miniconda 提供的任何免费 Linux64 包添加到 Heroku 应用程序。一些最受欢迎的软件包包括 numpy、scipy、scikit-learn、statsmodels、pandas 和 cvxopt。虽然 buildpack 使得将包添加到应用程序变得相当简单,但缺点是 buildback 占用了大量空间,并且您必须等待 Anaconda 更新存储库中的库。

如果您在 Heroku 上启动一个新的 Python 应用程序,您可以使用以下命令添加 conda buildpack:

$ heroku create YOUR_APP_NAME --buildpack https://github.com/kennethreitz/conda-buildpack.git

如果您已经在 Heroku 上设置了 Python 应用程序,则可以使用以下命令将 conda buildpack 添加到现有应用程序:

$ heroku config:add BUILDPACK_URL=https://github.com/kennethreitz/conda-buildpack.git

或者,如果您需要按名称指定应用程序:

$ heroku config:add BUILDPACK_URL=https://github.com/kennethreitz/conda-buildpack.git --app YOUR_APP_NAME

要使用 buildpack,您需要在 app 目录中包含两个文本文件,requirements.txt 和 conda-requirements.txt。就像标准的 Python buildpack 一样,requirements.txt 文件列出了应该使用 pip 安装的包。conda-requirements.txt 文件中列出了应使用 conda 安装的软件包。一些最有用的科学软件包包括 numpy、scipy、scikit-learn、statsmodels、pandas 和 cvxopt。可以在repo.continuum.io找到可用 conda 包的完整列表。

例如:

$ cat requirements.txt
gunicorn==0.14.2
requests==0.11.1

$ cat conda-requirements.txt
scipy
numpy
cvxopt

而已!您现在可以将 Anaconda 包添加到 Heroku 上的 Python 应用程序。

于 2015-01-27T03:02:00.340 回答
3

slug 编译器不知道您的环境变量,这就是它在推送期间失败的原因,而不是一次运行。

您唯一真正的选择是查看user_env_compile当前处于实验室测试版中的插件。

http://devcenter.heroku.com/articles/labs-user-env-compile

于 2012-03-22T14:12:47.880 回答
1

对于那些希望在生产中使用 Python 3.4 的人,我在 Ubuntu 10.04 上构建了 numpy 1.8.1、scipy 0.14.0 和 scikit-learn 0.15-git(0.14 由于某种原因不能与其他版本一起使用)作为二进制文件LTS 64 位,适用于 Heroku cedar 堆栈。这是 git repo

我的 heroku buildpack 与kmp非常相似。请注意,bin/steps/npscipy 文件链接到我上面的二进制存储库。

于 2014-05-13T13:22:05.923 回答
0

我把它放在这里以防有人像我一样偶然发现它。由于我使用的是 python 3.4,thenovices buildpack不适合我。

我试图查看 conda buildpack,但对于我只需要 scipy 和 numpy 的应用程序来说,这似乎有点矫枉过正。最终对我有用的是这个优秀的指南,使用了多 buildpacks 方法。scipy 安装确实有点长。希望这可以帮助!:)

于 2015-10-12T07:24:27.970 回答