Python SciPy需要BLAS吗?

184
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.

我需要从这个网站下载哪个tar文件?

我尝试了Fortrans,但是在设置环境变量后,我一直收到这个错误。


所以问题是从某个网站下载哪个版本适合您的系统,但问题中既没有提供系统详细信息,也没有提及具体的网站。难怪没有人给出答案。 - Michael J. Barber
7个回答

340

如果你需要使用最新版本的SciPy而不是打包版本,又不想经历构建BLAS和LAPACK的麻烦,可以按照以下步骤进行操作。

从软件源(repository)安装线性代数库(适用于Ubuntu),

sudo apt-get install gfortran libopenblas-dev liblapack-dev

在下载SciPy源代码后,安装SciPy: python setup.py install 或者

pip install scipy

视情况而定。


12
谢谢,这对我很有用!虽然我在Ubuntu 10.04上不得不把libopenblas-dev改成libblas-dev - alfetopito
1
在我的Mint 13(精确分支)上运行得非常完美。如果你使用easy_install -U #update,你需要单独下载源代码。 - wbg
2
它运行得非常完美。在我的情况下(ubuntu 12.0.4),我不需要做任何不同的事情。 - MisterWalrus
2
sudo apt-get install python-dev 解决了这个问题。https://dev59.com/ZmEi5IYBdhLWcg3wMZ3a#21530768 - endolith
3
sudo yum install blas-devel lapack-devel 对我来说有效。 - Roman
显示剩余4条评论

143

SciPy网站以前提供了编译和安装说明,但现在的说明仅仅依赖于操作系统二进制发行版。如果要在没有所需库的预编译包的操作系统上构建SciPy(和NumPy),则必须构建并静态链接Fortran库BLASLAPACK

mkdir -p ~/src/
cd ~/src/
wget http://www.netlib.org/blas/blas.tgz
tar xzf blas.tgz
cd BLAS-*

## NOTE: The selected Fortran compiler must be consistent for BLAS, LAPACK, NumPy, and SciPy.
## For GNU compiler on 32-bit systems:
#g77 -O2 -fno-second-underscore -c *.f                     # with g77
#gfortran -O2 -std=legacy -fno-second-underscore -c *.f    # with gfortran
## OR for GNU compiler on 64-bit systems:
#g77 -O3 -m64 -fno-second-underscore -fPIC -c *.f                     # with g77
gfortran -O3 -std=legacy -m64 -fno-second-underscore -fPIC -c *.f    # with gfortran
## OR for Intel compiler:
#ifort -FI -w90 -w95 -cm -O3 -unroll -c *.f

# Continue below irrespective of compiler:
ar r libfblas.a *.o
ranlib libfblas.a
rm -rf *.o
export BLAS=~/src/BLAS-*/libfblas.a

只执行五个g77/gfortran/ifort命令中的一个。我已经注释掉所有命令,但保留了我使用的gfortran命令。接下来安装LAPACK需要Fortran 90编译器,并且由于两次安装都应该使用相同的Fortran编译器,因此BLAS不应该使用g77。

接下来,您需要安装LAPACK。SciPy网页的说明也对我在这方面提供了帮助,但我必须修改它们以适应我的环境:

mkdir -p ~/src
cd ~/src/
wget http://www.netlib.org/lapack/lapack.tgz
tar xzf lapack.tgz
cd lapack-*/
cp INSTALL/make.inc.gfortran make.inc          # On Linux with lapack-3.2.1 or newer
make lapacklib
make clean
export LAPACK=~/src/lapack-*/liblapack.a

2015年9月3日更新: 今天已验证一些评论(感谢大家):在运行make lapacklib之前,编辑make.inc文件并将-fPIC选项添加到OPTSNOOPT设置中。如果您使用的是64位架构或想要编译为64位架构,请同时添加-m64。BLAS和LAPACK必须使用相同的选项进行编译。如果您忘记使用-fPIC,SciPy实际上会给出一个关于缺少符号的错误,并建议使用此开关。在我的设置中,make.inc的具体部分如下:

FORTRAN  = gfortran 
OPTS     = -O2 -frecursive -fPIC -m64
DRVOPTS  = $(OPTS)
NOOPT    = -O0 -frecursive -fPIC -m64
LOADER   = gfortran

在旧机器上(例如RedHat 5),gfortran可能安装的是较旧的版本(例如4.1.2),不支持选项-frecursive。在这种情况下,只需从make.inc文件中删除它。

由于无法找到blas库,Makefile的lapack测试目标在我的设置中失败了。如果您很细致,可以将blas库暂时移动到指定位置进行lapack测试。我是一个懒惰的人,所以我相信开发人员已经使其正常工作,并仅在SciPy中验证。


5
blas.tgz中没有libfblas。 - joedborg
32
对我有用,但我需要通过编辑make.inc文件来设置OPTS = -O2 -fPICNOOPT = -O0 -fPIC - gui11aume
8
@jdborg,显然现在它被称为liblapack.a。 - una_dinosauria
7
我必须在 make.inc 文件的 OPTS 和 NOOPT 设置中添加 -m64 选项。当然,只有在你使用的是 64 位机器时需要这样做。 - mjspier
21
非常感谢!另外,对于scipy,我不得不执行 export LAPACK=~/src/lapack-3.5.0/ 而不是在结尾处添加 libflapack.a - Legend
显示剩余4条评论

66

在 Fedora 上,这样做是可行的:

 yum install lapack lapack-devel blas blas-devel
 pip install numpy
 pip install scipy

记得安装 'lapack-devel' 和 'blas-devel',除了 'blas' 和 'lapack' 之外,否则您将会遇到您提到的错误或 "numpy.distutils.system_info.LapackNotFoundError" 错误。


它说“blas-dev的公钥未安装” :( - Olga Mu
@OlgaMu 使用“yum --nogpgcheck install blas-devel” - Muneeb Ali
在 Fedora 20 上,我需要使用 blas-staticlapack-static - hobs
谢谢!这对我在我的AWS EC2 Amazon Linux机器上运行起来了。 - Lil' Bits
这对于虚拟环境不起作用,除非我在pip安装时使用sudo,否则会失败。有什么想法吗? - user1610719

44

我猜你在谈论Ubuntu上的安装。只需使用:

apt-get install python-numpy python-scipy

这样做应该也会解决 BLAS 库的编译问题。否则,要编译 BLAS 库非常困难。


12
@V3ss0n,构建BLAS和LAPACK是众所周知的难点。在我看来,从头开始编译和安装内核比编译这两个该死的软件包容易得多。 - Nicholas Mancuso
@程序员,我在我的Debian机器上找到了解决办法。这个方法也应该适用于Ubuntu系统。你可以看一下这个链接: http://ydevel.tumblr.com/post/37462965735/installing-a-stack-for-scientific-computing-in-a [免责声明:这篇文章是我发布的] - yati sagade
@NicholasMancuso 确实很困难,但我设法构建了整个 Python(可重定位)+ Lapack + ATLAS(比 BLAS 更好)Scipy、Scikit、Maplotlib、NetworkX 和许多其他 C 依赖项。我的整个运行时文件夹现在有 900 MB(包括 Python、Perl、Java)哈哈,但这使得我的项目完全可以在一个文件夹中重新定位其自己的运行时。如果您需要,请告诉我。比 Virtualenv 好得多。 - Phyo Arkar Lwin
@yatisagade,@Coder,确实,您需要能够在虚拟环境中使用pip install scipy或从源代码构建它。 - Arthur

12

2

按照 'cfi' 给出的指示对我有效,但是他们遗漏了一些你可能需要的信息:

1) 解压后,你的lapack目录可能被命名为lapack-X-Y(版本号),所以你可以将其重命名为LAPACK。

cd ~/src
mv lapack-[tab] LAPACK

2) 在该目录下,您可能需要执行以下操作:

cd ~/src/LAPACK 
cp lapack_LINUX.a libflapack.a

-2

尝试使用

sudo apt-get install python3-scipy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接