在Mac Osx上构建/安装SciPy

35 投票
10 回答
36128 浏览
提问于 2025-04-17 15:33

我在我的Mac OS X上成功安装了NumPy,使用的是Python 2.7.3。现在我想安装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,但看来并没有?我该怎么下载它呢?

10 个回答

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(可以参考 pip安装numpy时的问题 - 运行时错误:工具链损坏:无法链接一个简单的C程序
  5. 最后输入 pip install numpy 来安装numpy
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。当然,从源代码编译会比安装预编译的包花更多时间,但最终结果应该是一样的。

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年某个时候,gfortran是和gcc分开的,所以命令是brew install gfortran。但如果你现在尝试这个命令,会出现错误,提示“GNU Fortran现在作为GCC的一部分提供,可以用以下命令安装:brew install gcc”。)


你真的想用pip来安装scipy,所以如果你还没有安装它,先去安装。苹果预装的Python,至少在10.7和10.8版本中,包含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安装是完全合理的。因为pythonpip2.7等会是苹果的Python;python3pip3.3等会是3.x版本的。

  • 如果你已经有pip,但担心它可能过时,可以用pip install --upgrade pip来升级。(除了安全性和稳定性方面的好处,这样做可能会节省你很多时间,因为它让你与一些科学栈或其他模块的二进制包兼容。)

  • 对于大多数非苹果的Python安装(甚至可能包括苹果在10.9或10.10的版本;我没有检查),你不应该使用easy_install来安装pip。请遵循pip的安装说明。但首先确保你没有已经安装它。

    • 如果你使用virtualenv/venv,你的虚拟环境中已经包含pip
    • Python 3.4或更高版本可能(如果是从python.org安装的,肯定会)包含一个pip引导程序。如果你的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,并且想避免路径问题,你需要做两件事:

首先,绝对不要在多个Python中安装任何包含脚本或二进制文件的Python包(包括pip本身)。例如,如果你同时为苹果的2.7和Homebrew的2.7安装ipython,两个都会尝试创建名为/usr/local/bin/ipython/usr/local/bin/ipython-2.7的脚本。如果你运气好,一个安装会失败。否则,它们都会成功,一个会覆盖另一个,你将无法运行被覆盖的版本。

其次,确保替代Python的脚本和二进制文件的路径在PATH中排在苹果的前面。根据你安装的替代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等),显然现在没有支持的方法来做到这一点,但已弃用的QA1067似乎在Lion中仍然有效。这也是Homebrew的常见问题Python常见问题所建议的。

如果你只关心命令行会话(包括Terminal.app和远程ssh),你可以按照标准的Unix方式编辑相应的配置文件。哪个配置文件适合取决于你想影响的内容。(影响所有用户还是仅一个用户?bash还是其他shell?等等。)如果你不知道该用哪个,真的应该做一些研究。如果你不想费心学习,就直接用~/.profile,然后如果结果不是你想要的就别抱怨。

无论哪种方式,你都需要确保适当的路径在PATH中排在/usr/bin之前。所以,例如,你可以在~/.profile中添加以下内容:

PATH=/usr/local/bin:$PATH
export PATH

当然,你需要创建一个新的终端shell,或者执行这个脚本,才能使其生效。

如果你使用homebrew,可以用brew doctor来检查你是否设置正确。

撰写回答