安装 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
    

更新 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') /usr/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 目前在国内无法正常访问,所以不使用