在Heroku上运行Scipy

Jos*_*ang 27 numpy heroku blas scipy

我让Numpy和Matplotlib在Heroku上运行,我也试图安装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
Run Code Online (Sandbox Code Playgroud)

在我的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.
Run Code Online (Sandbox Code Playgroud)

看来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
~ $ 
Run Code Online (Sandbox Code Playgroud)

看起来很好.现在我不知道如何解决这个问题.

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

小智 15

我设法通过将numpy和scipy离线构建为bdists然后修改heroku python buildpack以将这些直接解压缩到dyno的vendor/venv区域来使这个工作在雪松堆栈上.您还可以使用buildpack来设置持久存在的环境变量.

Heroku还没有正式发布buildpacks - 搜索'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-installed numpy/scipy要求你有一个fortran编译器+相关的开发环境,这使得我的slug太大了.

它似乎工作,slug大小现在是35mb,缩放似乎也很快.除了一个numpy测试之外的所有测试都通过了,所有的scipy测试都通过了.

这对我来说还在进行中,但我想我会分享.

  • 做得好!我是Heroku的Python人.:) (3认同)

kmp*_*kmp 9

如果其他人像我一样来到这里......

@coshx对这个问题的出色答案遗憾地不再适用(至少我无法让它起作用).我做了什么,但是如下:

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

  2. 我从@coshx 分叉了npsp-helloworld存储库,并使用了一个requirements.txt文件而不是setup.py(我的fork在这里 - 这意味着你可以使用整个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
Run Code Online (Sandbox Code Playgroud)

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

pip install scipy==0.11.0
pip install numpy==1.7.0
pip install scikit-learn==0.13.1
Run Code Online (Sandbox Code Playgroud)

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


eri*_*ric 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
Run Code Online (Sandbox Code Playgroud)

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

$ heroku config:add BUILDPACK_URL=https://github.com/kennethreitz/conda-buildpack.git
Run Code Online (Sandbox Code Playgroud)

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

$ heroku config:add BUILDPACK_URL=https://github.com/kennethreitz/conda-buildpack.git --app YOUR_APP_NAME
Run Code Online (Sandbox Code Playgroud)

要使用buildpack,您需要在app目录,requirements.txt和conda-requirements.txt中包含两个文本文件.与标准Python buildpack一样,requirements.txt文件列出了应使用pip安装的软件包.应使用conda安装的软件包列在conda-requirements.txt文件中.一些最有用的科学软件包包括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
Run Code Online (Sandbox Code Playgroud)

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


Nei*_*ton 3

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

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

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