键盘快捷键

使用 跳转章节

使用 S/ 在本书内搜索

使用 ? 显示帮助页面

使用 Esc 隐藏帮助页面

安装 SageMath

archive time: 2024-08-29

SageMath 好像火了?

缘起

之前在寻找合适自己的 CAS1 的时候,顺手做了一期介绍 SageMath 的视频

这个视频在当时没有什么人看,我也就渐渐忘记了,直到最近,突然有人通过 Bilibili 的私信来问我 SageMath 的使用方法,我才意识到 SageMath 好像火了

据我估计,应该是由于某些原因,学校上课原本使用的软件不让使用了,亦或需要寻找国产或开源替代品,所以选择了 SageMath,这才让 SageMath 逐渐流行起来了

综上,我也就萌生了想要好好学一下 SageMath 的想法

不过学习 SageMath 的第一步就是要安装 SageMath

安装方法

具体的安装方法可以参考 SageMath 安装教程,总结起来大概有四种方法:

  • 通过预编译好的二进制包或者通过 包管理器 安装
  • 通过 conda-forge 中的预编译二进制包安装
  • 通过源码安装
  • 通过 Docker 镜像安装

其中对于大多数人,我的推荐是通过 Docker 安装,这样可以避免很多环境上的麻烦,使用起来也比较方便, 而通过预编译二进制包的方式,不论是 包管理器 还是 conda-forge,我都不是很推荐,因为可能会出现各种性能和兼容性问题

但是我自己还是选择了通过源码的方式安装,因为我现在不太方便使用 Docker2,另外在本地编译运行可以获得比较好的性能表现

安装步骤

其他方式的安装我就不再细说,我这里主要列一下通过源码安装的步骤以及过程中需要注意的地方, 具体的文档可以参考 这里

下载源码

第一步就是要下载源码,如果网络比较好,可以直接到 官网 下载, 如果想要尝试一下开发版,而不是使用稳定版,可以到官网的 这里 下载, 亦或者可以通过 git clone 来获取 Github 的源码

安装必要的软件

编译自然需要编译器以及一些依赖,而 必须需要的依赖 是很少的, 因为 SageMath 已经将大多数依赖的源码包含在了项目中,如果需要,可以直接通过源码安装

具体来说有以下几项:

  • GNU Make
  • GNU M4
  • Perl
  • ar 和 ranlib
  • tar
  • Python

对于 macOS arm64 用户,可能需要安装 gengetopt, 并且 e_antic 以及依赖 e_antic 的包都不能正常编译, 如果需要,建议使用 conda-forge 方法安装

编译器方面,推荐使用 GCC 和 GCC-Fortran,对于不同平台的安装方式,在文档中已经详细说明了,这里就不再过多叙述

编译步骤

特别注意,对于 Windows 用户,建议使用 WSL2 来安装,如果要使用 Docker 同样也是需要使用 WSL2 的

而对于 macOS 用户,如果使用 homebrew 作为包管理器,还可以在源码下发现 .homebrew-build-env,在编译前需要使用这个脚本改变一下环境

  1. 创建目标文件夹,,这个目标文件夹是最后 SageMath 最后编译到的位置,例如 ~/.local/sdk/sage,之后使用 <sage_home> 来表示

  2. 将源码移动到目标文件夹下,因为源码在编译完成后 仍然需要,所以建议将源码放在目标文件下,方便管理, 如果源码是压缩包格式下载的,需要先解压缩,解压出来应该是 sage-x.y 这种格式的一个文件夹,其中 x 和 y 分别表示 SageMath 的版本, 然后将解压缩出来后的文件夹移动到目标文件夹下

  3. 切换到源码目录下,所有的编译过程都是在源码目录下发生的,所以要提前进入源码目录,此时你的位置($PWD)应该是 <sage_home>/sage-x.y, 然后执行以下命令来准备必要的环境变量:

    # 设置 SageMath 的数据目录,最好写入 .bashrc 或者 .zshenv 长期使用
    export DOT_SAGE="<dot_sage>" # 替换 <dot_sage> 为具体目录地址
    # 设置编译时根目录,也就是 <sage_home>/sage-x.y
    export SAGE_ROOT=$PWD
    # 设置之后的 SageMath 根目录,建议写入 .bashrc 或者 .zshenv
    export SAGE_LOCAL="<sage_home>" # 替换为具体目录地址
    # 对于 macOS 或 hoembrew 用户,还需要执行下面的命令
    command -v brew >/dev/null 2>&1 && source .homebrew-build-env
    # 还可以设置一下使用的编译器
    export CC="<cc>" # 替换成具体编译器,例如 gcc,clang
    # ...
    

    具体的环境变量设置可以参考 相关文档

  4. 配置编译条件,也就是执行目录下的 configure 脚本,具体可以使用的选项可以参考 ./configure --help 这里有几个建议的选项

    • prefix:设置编译好后的文件位置,设置为目标文件夹,--prefix="$SAGE_LOCAL"
    • with-system-setuptools:建议不要使用系统的 setuptools,因为会出现兼容问题,--with-system-setuptools=no
    • with-system-python3:同上,--with-system-python3=no
    • with-system-meson_python:同 with-system-setuptools--with-system-meson_python=no

    总结下来,就是这样一条命令:

    ./configure --prefix="$SAGE_LOCAL" \
        --with-system-setuptools=no \
        --with-system-python3=no \
        --with-system-meson_python=no
    
  5. 执行编译,具体参数的作用建议参考文档

     make -s V=0
    

完整的编译脚本可以参考:

编译脚本

只需要把路径更改为自己的实际路径就好:

#!/usr/bin/env bash

set -euo pipefail

# 设置环境变量
export DOT_SAGE="$XDG_STATE_HOME/sagemath"
export SAGE_LOCAL="$XDG_SDK_HOME/sagemath"
export SAGE_ROOT="$XDG_SDK_HOME/sagemath/sage"
# 对于苹果用户,需要设置 brew
command -v brew >/dev/null 2>&1 && source "$SAGE_ROOT/.homebrew-build-env"

# 对于非标准 CMAKE
export CMAKE_POLICY_VERSION_MINIMUM="3.5"

# 切换到 sage 源码目录
cd "$SAGE_ROOT"

# 设置编译选项
if [[ -f "$SAGE_ROOT/configure" ]]; then
  make reconfigure
else
  make configure
fi

# 编译配置
./configure \
  --with-system-python3=no \
  --with-system-cmake=yes \
  --with-system-curl=yes \
  --with-system-meson=no \
  --with-system-ninja_build=no \
  --with-system-pkgconfig=no \
  --with-system-numpy=no \
  --with-system-scipy=no \
  --with-system-cvxopt=no \
  --with-system-cython=no \
  --with-system-matplotlib=no \
  --with-system-jupyter_core=no \
  --with-system-jupyter_client=no \
  --with-system-ipython=no \
  --with-system-pip=no \
  --with-system-setuptools=no \
  --with-system-sympy=no \
  --with-system-networkx=no \
  --with-system-pandas=no \
  --with-system-pillow=no \
  --with-system-pygments=no \
  --with-system-pyparsing=no \
  --with-system-pyzmq=no \
  --with-system-jinja2=no \
  --with-system-sphinx=no \
  --with-system-flint=no \
  --with-system-pari=no \
  --with-system-gmp=no \
  --with-system-mpfr=no \
  --with-system-mpc=no \
  --with-system-ecl=no \
  --with-system-gap=no \
  --with-system-singular=no \
  --with-system-polymake=no \
  --with-system-libpng=no \
  --with-system-libjpeg=no \
  --with-system-freetype=no \
  --with-system-imagemagick=no \
  --with-system-gcc=yes \
  --with-system-gfortran=yes \
  --with-system-openblas=yes \
  --with-sage-venv=yes \
  --enable-system-site-packages=no \
  --disable-download-from-upstream-url \
  --enable-notebook=yes \
  --enable-doc=yes \
  --enable-wheels=yes \
  --disable-meson-check \
  --prefix="$SAGE_LOCAL" # 设置安装路径

# 开始编译
if [[ "$(uname)" == "Darwin" ]]; then
  JOBS=$(sysctl -n hw.ncpu)
elif [[ "$(uname)" == "Linux" ]]; then
  JOBS=$(nproc)
else
  JOBS=4
fi

make -j"$JOBS" -s V=0

更新 SageMath

仔细观察会发现,下载下来的源码中是有 .git 文件夹的, 也就意味着我们可以像普通的 git 仓库一样使用 git pull 来更新代码

[[ -d "$SAGE_ROOT/.git" ]] && git pull

更新完成,我们就可以重新编译代码来更新更新 SageMath

# 编译前的准备,参考步骤 3
# ...
make distclean && make build

当然,不是所有情况下我们都需要从头编译,更多时候我们只需要把更新的部分重新编译安装即可

# 编译前的准备,参考步骤 3
# ...
make -j list-broken-packages

通过上述命令可以找出有哪些包出现了问题,最后会得到类似下面的输入内容:

# 省略上面输出
Uninstall broken packages by typing:

   make lcalc-SAGE_LOCAL-uninstall;
   make ratpoints-SAGE_LOCAL-uninstall;
   make r-SAGE_LOCAL-uninstall;
   make suitesparse-SAGE_LOCAL-uninstall;

我们只需要执行这些 make 命令,然后再执行:

make build

就能够完成编译更新了, 其他更新相关内容可以参考 这个文档

配置使用

在使用之前有一些环境变量需要设置,具体可以参考 这个文档

建议设置 DOT_SAGESAGE_LOCALSAGE_STARTUP_FILE 这三个变量,同时为了能够直接使用,还需要设置 PATH

个人建议是将 ~/.local/bin 加入 PATH, 很多遵守 XDG 的程序,例如 GHCup,也会选择将二进制文件放在 ~/.local/bin 中, 而我们就可以将 sage 链接到这里,避免 SageMath 的文件与系统文件冲突

# 将 ~/.local/bin 加入 PATH
export PATH="$HOME/.local/bin":"$PATH"
# 将 sage 链接到 ~/.local/bin
ln -s $("$SAGE_ROOT/sage" -sh -c 'ls $SAGE_ROOT/venv/bin/sage') "$HOME/.local/bin"

使用

因为在编译过程中我们没有使用系统的 Python,而是使用与 SageMath 对应的 Python 版本,所以 SageMath 中是无法使用系统中安装的 Python 包的

如果我们想要添加一些 Python 包到 SageMath 中,可以使用

sage --pip install "<package-you-want>"

相关使用教程可以参考官方的 教程, 同时可以在 这里 找到许多有用的文档

至于 IDE,编辑器,我都是推荐使用 SageMath 包含的 JupyterLab,可以使用如下方式使用

sage -n jupyterlab

相关设置可以参考 JupyterLab 文档, 本地化可以参考 这个文档


  1. Computer Algebra System.Wikipedia [DB/OL].(2024-07-01)[2024-08-29] https://en.wikipedia.org/wiki/Computer_algebra_system

  2. 因为我电脑性能以及系统配置不太能负担 Docker,同时考虑到我两台电脑(macOS 和 ArchLinux)间数据和配置的同步问题, 再加上 Docker Hub 目前在国内无法正常访问,所以不使用