2012-03-22 58 views
26

我與NumPy和Matplotlib在Heroku上運行的運行SciPy的,我試圖安裝SciPy的爲好。但是,Scipy需要安裝BLAS [1],這在Heroku平臺上沒有提供。在聯繫Heroku支持後,他們建議我將BLAS構建爲一個靜態庫來部署,並設置必要的環境變量。在Heroku

所以,我的系統上編譯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上運行的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

回答

15

我設法通過建立numpy的和SciPy的下線爲bdists,然後修改Heroku的蟒蛇buildpack直接解壓縮這些到測功機的供應商/ VENV領域得到雪松堆棧這方面的工作。您也可以使用buildpack來設置持久化的環境變量。

的Heroku還沒有正式公佈buildpacks尚未 - 搜索「的Heroku buildpacks」獲得更多的第三方/ Heroku的那些信息。

我的蟒蛇構建包的叉是在這裏: https://[email protected]/wyn/heroku-buildpack-python.git

的變化是在bin /編譯在那裏我源的兩個新的步驟,一個SciPy的/ numpy的步驟和openopt一步。這兩個步驟的腳本位於bin/steps/npscipy和bin/steps/openopt中。我還添加了一些變量bin/release。請注意,我假設通過setup.py文件進行安裝,而不是通過requirements.txt方法進行安裝(c.f. https://devcenter.heroku.com/articles/python-pip#traditional_distributions)。

我還下載了blas/lapack/atlas/gfortran二進制文件,用於在dyno上構建numpy/scipy,因爲有c擴展需要鏈接到它們。建立一切離線和下載的原因是,pip安裝numpy/scipy要求你有一個fortran編譯器+相關的開發環境,這使我的slu too太大。

它似乎工作,slu size大小現在35mb和縮放似乎很快。除了其中一個numpy測試外,所有的scipy測試都通過了。

這仍然在爲我工作,但我想我會分享。

+1

對不起忘了說了,如果你想使用buildpack原樣然後執行:$ Heroku的創建應用程序的名字--stack =雪松[email protected]:WYN/Heroku的-buildpack-python.git – coshx 2012-05-17 12:11:49

+3

太棒了!我是Heroku的Python傢伙。 :) – 2012-05-18 21:45:59

+0

謝謝,我很喜歡玩雪松堆疊和構建包。我現在正在研究vulcan製造商,我認爲用這種方法建立這些東西會很好... – coshx 2012-05-19 07:53:17

8

萬一別人談到這個像我一樣...

對這個問題excellent answer@coshx可悲的不再有效(至少我不能工作)。我所做的,不過是以下幾點:

  1. 我分叉從@coshx npsicpy-binaries庫並改變了所有的tar文件,使得他們沒有venv作爲根文件夾內(我的叉子是here

  2. 我從@coshx分支npsp-helloworld存儲庫,並使用requirements.txt文件而不是setup.py(我的分支是here--這意味着您可以使用整個點法)。

  3. 我分叉的heroku-buildpack-python庫從Heroku的,拿了從@coshx的npscipy文件,並更改它生成包的這個最新版本的工作(我的叉子是here - 你可以看到,有沒有VENV成立,例如)。

做完這三件事後,我的npsp-helloworld應用程序工作完美。你只需要確保你創建應用程序時設置適當的buildpack,你是好去:

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

注:我還沒有制定出如何使自己的二進制文件還,所以這三個庫( SciPy的,numpy的和scikit學習)是不是最新的版本,所以請確保安裝設備時,你(如果任何人都可以建造這些我很樂意接受他們拉入請求):

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

順便說一句 - 如果我沒有以正確的方式進行禮儀,我真的很抱歉。我仍然在學習git和整個開源的東西。

1

對於那些希望在生產環境中使用Python 3.4的人,我已經構建了numpy 1.8.1,scipy 0.14.0和scikit-learn 0.15-git(0.14由於某種原因不能與其他人一起工作)作爲Ubuntu 10.04 LTS 64位的二進制文件,它在Heroku雪松堆棧上工作。 Here is the git repo

我的heroku buildpack與kmp非常相似。請注意,bin/steps/npscipy文件鏈接到我上面的二進制文件存儲庫。

8

另一個不錯的選擇是conda buildpack,它允許您通過Anaconda/Miniconda將任何可用的免費Linux64軟件包添加到Heroku應用程序中。一些最受歡迎的軟件包包括numpy,scipy,scikit-learn,statsmodels,pandas和cvxopt。雖然buildpack使得嚮應用添加軟件包相當簡單,但缺點是buildback佔用大量空間,而且您必須等待Anaconda更新存儲庫中的庫。

如果你開始在Heroku上一個新的Python應用程序,你可以使用命令添加暢達buildpack:

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

如果您已經安裝在Heroku上一個Python應用程序,你可以暢達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安裝的軟件包列在conda-requirements.txt文件中。一些最有用的科學軟件包包括numpy,scipy,scikit-learn,statsmodels,pandas和cvxopt。可用的conda軟件包的完整列表可在repo.continuum.io找到。

例如:

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

$ cat conda-requirements.txt 
scipy 
numpy 
cvxopt 

這就是它!您現在可以將Anaconda軟件包添加到Heroku上的Python應用程序中。

+0

[明確的解釋](https://devcenter.heroku.com/articles/python-c-deps)爲什麼conda buildpack存在。請注意,這個buildpack由Kenneth Reitz維護,他負責[Heroku的Python產品的技術設計。](https://www.linkedin.com/in/kennethreitz) – Jason 2016-05-17 13:20:08

1

我把這個放在這裏以防萬一有人像我這樣偶然發現了這個。由於我使用python 3.4,thenovices buildpack不適合我。

我想看看暢達buildpack,但似乎我的應用程序矯枉過正的一點點只需要SciPy的和numpy的。最後對我的作品是this excellent guide,使用多構建包的方法。 scipy的安裝確實有點長。希望這可以幫助! :)