SciPy的构建/安装Mac Osx

35

我成功地在我的Mac OS X上为Python 2.7.3构建/安装了NumPy。 现在我也想构建/安装scipy。我从GitHub上下载了它。 进入目录后,运行python setup.py build,它似乎一直在工作,直到遇到了这个错误:

customize Gnu95FCompiler
Could not locate executable gfortran
Could not locate executable f95
customize NAGFCompiler
customize AbsoftFCompiler
Could not locate executable f90
Could not locate executable f77
customize IBMFCompiler
Could not locate executable xlf90
Could not locate executable xlf
customize IntelFCompiler
Could not locate executable ifort
Could not locate executable ifc
customize GnuFCompiler
Could not locate executable g77
customize G95FCompiler
Could not locate executable g95
customize PGroupFCompiler
Could not locate executable pgfortran
don't know how to compile Fortran code on platform 'posix'
building 'dfftpack' library
error: library dfftpack has Fortran sources but no Fortran compiler found

我以为我已经安装了NumPy所需的Fortran...但估计没有?我应该如何下载它呢?


你需要最新版本吗?为什么不使用easy_install或pip呢? - BenDundee
当我安装NumPy时,我尝试使用pip,但是我感到困惑,后来我下载了homebrew,然后NumPy起作用了。 - Megan
2
让我说一下:如果你打算在Python中做任何事情,你可能想要弄清楚pip。 - BenDundee
你是使用苹果预装的Python还是其他的(python.org、Homebrew等)?答案因情况而异(尽管我相信每种情况都有一个重复)。 - abarnert
我不一定需要Python 2.7.3,上个学期我为了课程下载了它。我知道Mac自带一个预装版本,但我认为没有两个路径,我认为更新前它删除了另一个版本。 - Megan
显示剩余3条评论
10个回答

94
您的问题是需要安装Fortran编译器来构建scipy。此外,如果您已经有一个禁用了Fortran支持的numpy,则可能需要替换它。一些苹果预安装的Python版本中有这样的numpy构建预安装。

获取Fortran的最简单方法是使用Homebrew。如文档所述,您需要先安装Xcode及其命令行工具。(安装命令行工具的方式几乎每个Xcode主要版本都会更改,因此请参阅链接的文档以获取最新说明。)然后安装Homebrew。安装URL已经多次更改,请参见Homebrew首页或安装说明(http://brew.sh/),但它将类似于:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

然后:

brew install gcc

(请注意,直到2014年某个时候,gfortrangcc是不同的安装方式,因此命令为brew install gfortran。但如果你现在尝试这样做,你会收到一个错误提示,上面写着“GNU Fortran现在作为GCC的一部分提供,可以通过以下方式安装:brew install gcc”。)

如果你想使用pip安装scipy,那么如果你没有它,首先要获取它。在10.7和10.8中,苹果预装的Python中包括easy_install但不包括pip,所以最简单的方法是:

sudo easy_install pip

然而,您可能希望考虑使用virtualenv而不是全局安装(在这种情况下,您还需要在以下命令中删除sudo)。
现在,您已经拥有了gfortranpip,您只需要执行以下操作即可:
sudo pip install --upgrade numpy
sudo pip install scipy

注意事项:

上述指南适用于苹果预装的Python版本。如果您使用不同版本的Python,您应该考虑不这样做。保持路径、安装包等同步会是一场噩梦。唯一的例外是您需要Python 3.x版本,此时从python.org或Homebrew安装是完全合理的。不会发生冲突,因为 python pip2.7 等将用于Apple的Python; python3 pip3.3 等将用于3.x版本。
如果您已经有了 pip ,但担心它可能过时,可以使用 pip install --upgrade pip 进行更新。(除了安全和健壮性方面的好处外,这还可以通过使您与某些科学堆栈或其他模块的二进制轮兼容来节省大量时间。)
对于大多数非苹果Python安装(甚至可能是10.9或10.10的苹果安装; 我没有检查过),您不应该使用 easy_install 来安装 pip 。请遵循 pip install instructions。但首先确保您没有它。
  • 如果您使用 virtualenv / venv ,您的虚拟环境将已经包含 pip
  • Python 3.4或更高版本可能(如果来自python.org安装程序,则会)包括 pip bootstrap。如果您的3.4+还没有 pip ,您可能需要使用 python -m ensurepip 进行安装。
  • 像Homebrew或ActiveState这样的第三方安装包已经包含了 pip
对于Python 3.3或更高版本,您可能希望使用内置的 venv 而不是 virtualenv
如果您使用MacPorts、Fink、gentoo-alt等,您应该安装与您的软件包管理器一起提供的 scipy 包,并且它会拉取出所需的任何其他内容(甚至包括重建Python和GCC)。
Enthought和ActiveState等第三方二进制安装可能已经包含了 scipy 和您需要的所有其他内容。如果没有,说明基本相同,但您将不得不猜测要跳过哪些步骤或遵循哪些步骤,是否要使用 sudo 等。
如果您使用的是非苹果版本的Python 2.7,并且想要避免路径问题,您需要做两件事:
首先,绝不要安装任何包含脚本或二进制文件(包括pip本身)在多个Python中的Python包。例如,如果您为Apple 2.7和Homebrew 2.7都安装了ipython,则两者都将尝试创建名为/usr/local/bin/ipython和/usr/local/bin/ipython-2.7的脚本。如果您很幸运,一次安装将失败。否则,它们都会成功,一个将覆盖另一个,您将无法运行被覆盖的版本。
其次,请确保备选Python的脚本和二进制文件的路径在PATH中位于Apple的路径之前。根据您安装的备选Python和所遵循的说明,这可能是:
  • /usr/local/bin
  • /Library/Frameworks/Python.framework/Versions/2.7/bin
  • /usr/local/share/python2.7/bin
  • /usr/local/Cellar/python/2.7.3/bin
  • 其他路径

无论是哪个路径,您都需要编辑您的PATH变量。

如果您想影响GUI应用程序(以及LaunchAgents等),显然不再支持这样做的方法,但在Lion中QA1067似乎仍然有效。 这也是Homebrew FAQPython FAQ建议的方法。

如果你只关心命令行会话(包括Terminal.app和远程ssh),你可以只编辑相应的配置文件,这是标准的Unix操作。哪个配置文件适合取决于你想要影响什么。(所有用户还是只有一个用户?bash还是任何shell?等等)如果你不知道你想要哪一个,你真的应该做一些研究。如果你不想学习,只需使用~/.profile,然后不要抱怨它不是你想要的。
无论如何,你需要确保适当的路径在PATH之前出现/usr/bin。例如,你可以将以下内容添加到~/.profile中:
PATH=/usr/local/bin:$PATH
export PATH

(在生效前,您需要创建一个新终端或运行该脚本。)
(如果您正在使用homebrew,则可以通过运行brew doctor来确认是否正确安装。)

非常有用的帖子,一直避免在我的笔记本电脑上安装Scipy,直到现在。他们在Scipy网站上宣传的方式(使用Macports)对我来说失败了,但这个方法完美地解决了问题。 - qwwqwwq
1
现在安装Fortran编译器的命令是 brew install gcc - jjfine
1
@jjfine:现在是这样,但21个月前提问者问这个问题时并不是这样。(但我会为未来的读者更新答案。) - abarnert
3
@jjfine:我在更新过程中,顺便更新了各种过时的链接、URL、版本号等。 - abarnert
我知道我可以使用你的答案和brew来解决问题(或者我希望我能),但是如果我单独使用pip3安装numpy,为什么fortran编译器不存在呢?就像我执行了pip3 install numpy,但它仍然显示找不到fortran编译器。 - Charlie Parker
我之前安装了 gcc,但是在使用 homebrew 重新安装 gcc 后,现在一切都正常了。 - Kxrr

3

看起来你实际的问题只是来自Sourceforge的间歇性下载失败:

curl: (33) HTTP server doesn't seem to support byte ranges. Cannot resume. Error: Download failed: downloads.sf.net/project/machomebrew/Bottles/…

如果您遇到错误,请尝试再次执行 brew install gfortran,Homebrew 应该会自动恢复。这是第一件要尝试的事情。
如果这不起作用,请查看brew doctor是否发现了任何问题,然后使用 brew install -d gfortran 查看它正在存储的部分下载文件的位置,以便您可以手动删除它并重试。
如果所有尝试都失败了,您可以通过使用 --build-from-source 强制它不使用 bottle。当然,从源代码构建比安装二进制文件需要更长的时间,但应该会产生相同的结果。

3
截至2014年5月20日,如果您正在使用brew,则Fortran已作为gcc的一部分安装。无需单独安装Fortran包。以下是我安装numpy所用的方法:
  1. 按照abamert的答案安装brew(或参见http://brew.sh/
  2. 安装gcc(brew install gcc
  3. 确认brew的gcc是正确的(which gcc应该指向/usr/local/bin/gcc)
  4. export ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future(参见Problems with pip install numpy - RuntimeError: Broken toolchain: cannot link a simple C program
  5. pip install numpy

2

我认为这个问题并不太复杂。

1)安装pip

cd /Library/Frameworks/Python.framework/Versions/ ln -s 2.7 Current

cd /usr/bin rm -f python ln -s /Library/Frameworks/Python.framework/Versions/Current/bin/python python

2)从https://pypi.python.org/pypi/setuptools#files下载egg文件,然后运行以下命令:

sudo sh setuptools-0.6c11-py2.7.egg

3)从以下链接下载gfotran并安装:

http://r.research.att.com/tools/

4)安装scipy、numpy和matplotlib:

sudo pip install -U scipy sudo pip install -U numpy sudo pip install -U matplotlib

希望你现在已经拥有了所需的一切。


1
我遇到了同样的问题,使用以下步骤:
1. 安装gfortran: brew install gfortran
2. 安装scipy: pip install scipy
然后就可以了。

1
请在此写作时执行brew install gcc - william_grisaitis

1
我已经安装了 gfortran,而且二进制文件名为 gfortran-4.2。所以,每次我尝试安装 SciPy 时,编译器都无法找到,因为它试图使用 gfortran

我所做的是创建一个 gfortran-4.2 的符号链接到 gfortran

要找到应该在哪里创建符号链接,请运行:

$ which gfortran-4.2
/usr/local/bin/gfortran-4.2

然后创建符号链接:
ln -s /usr/local/bin/gfortran-4.2 /usr/local/bin/gfortran

0

对于OSX Yosemite和可能的旧版OSX,您可能需要在运行pip install scipy之前下载并安装Fortran编译器。要下载最新的Fortran编译器,只需访问以下链接:

https://gcc.gnu.org/wiki/GFortranBinaries#MacOS


0

我认为你的Xcode版本和OSX版本都很重要。我的Xcode版本是6.4,OS X版本是10.11.1,但仍然收到了相同的错误信息(无法找到gfortran等)。我尝试了很多方法,包括@abarnert的详细回答,但对我来说解决方案是升级Xcode(至7.1.1)。


-1

我已经安装了Homebrew,所以我要尝试运行命令:$brew install gfortran 希望这能成功。


Xcode 的命令行工具?我昨晚在 Xcode->首选项->下载->组件->命令行工具中安装了它,我需要再采取其他步骤吗? - Megan
@Megan:实际上,这只是来自Sourceforge的下载错误。在某个时刻,你的互联网连接可能中断了或者他们的网站过载了,导致你只下载了部分文件,而现在它正在尝试恢复下载。你可以再次尝试 brew install gfortan。如果不行,你可能需要运行 brew doctor 或者 brew install -d gfortran,然后查看部分文件的位置并将其删除,然后才能让 brew 重新开始下载。 - abarnert
@Megan:或者,你可以使用“--build-from-source”强制它不使用bottle,但这会花费更长的时间。 - abarnert
@Megan:这就是为什么我建议不要安装第二个Python 2.7,除非你知道自己在做什么。无论如何,Homebrew [FAQ](https://github.com/mxcl/homebrew/wiki/FAQ)和[Python FAQ](https://github.com/mxcl/homebrew/wiki/Homebrew-and-Python)有一些信息,但并不完整。答案取决于您是否希望将PATH影响当前登录、所有终端/ssh登录或所有登录(包括GUI应用程序)。我会更新我的答案,提供更多细节。 - abarnert
==> 正在下载 https://downloads.sf.net/project/machomebrew/Bottles/gfortran-4. ######################################################################## 100.0% ==> 正在倒入 gfortran-4.7.2.lion.bottle.tar.gz ==> 注意事项 - Megan
显示剩余10条评论

-2

该页面顶部明确说明已过时。它还建议使用Homebrew在Apple自带的Python 2.7旁边安装另一个Python 2.7版本,而Homebrew明确建议不要这样做。此外,这还需要手动修改PATH和链接。总的来说,我认为这不是一个好的答案。 - abarnert
随便。她已经安装了Python,除此之外,指令似乎与你发布的差不多。 - BenDundee
1
除非你只是想让scipy“差不多”安装好,而不需要它真正地工作,“随便”这种态度并不是很有帮助。我所建议的和那篇文章所建议的之间存在一些重要的区别,如果你分辨不出这些区别(或者如果你太懒了,只是简单地阅读了整篇文章),你将无法帮助那些遇到问题的人(而那些遵循该页面的人都会遇到问题)。 - abarnert
这些指令与我安装Python scipy和numpy时使用的完全相同,而我几乎每天都使用它们而没有任何问题——我正在引导她去一个我发现有用的资源。当涉及到认为安装非苹果版本的Python是个好主意时,我不认为我在stackoverflow上是孤单的。所以,真的...无论如何,接受或离开都可以。 - BenDundee
1
我不应该如此消极地回应——对不起 @abarnert。 - BenDundee
我有一台安装了Python的Windows电脑,如果我在Mac上无法弄清楚它,我会尝试在那里进行。只是我的Mac电池寿命更长,噪音也不会干扰课堂,对学校来说更好。因此,如果可能的话,我想先在我的Mac上安装所有的扩展程序。 - Megan

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