安装 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
,在编译前需要使用这个脚本改变一下环境
-
创建目标文件夹,,这个目标文件夹是最后 SageMath 最后编译到的位置,例如
~/.local/sdk/sage
,之后使用<sage_home>
来表示 -
将源码移动到目标文件夹下,因为源码在编译完成后 仍然需要,所以建议将源码放在目标文件下,方便管理, 如果源码是压缩包格式下载的,需要先解压缩,解压出来应该是
sage-x.y
这种格式的一个文件夹,其中 x 和 y 分别表示 SageMath 的版本, 然后将解压缩出来后的文件夹移动到目标文件夹下 -
切换到源码目录下,所有的编译过程都是在源码目录下发生的,所以要提前进入源码目录,此时你的位置(
$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 # ...
具体的环境变量设置可以参考 相关文档
-
配置编译条件,也就是执行目录下的
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
- prefix:设置编译好后的文件位置,设置为目标文件夹,
-
执行编译,具体参数的作用建议参考文档
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_SAGE
、SAGE_LOCAL
和 SAGE_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 文档, 本地化可以参考 这个文档
Computer Algebra System.Wikipedia [DB/OL].(2024-07-01)[2024-08-29] https://en.wikipedia.org/wiki/Computer_algebra_system
因为我电脑性能以及系统配置不太能负担 Docker,同时考虑到我两台电脑(macOS 和 ArchLinux)间数据和配置的同步问题, 再加上 Docker Hub 目前在国内无法正常访问,所以不使用