如何在 Anaconda 中安装 SageMath 内核?

Posted

技术标签:

【中文标题】如何在 Anaconda 中安装 SageMath 内核?【英文标题】:How to install SageMath kernel in Anaconda? 【发布时间】:2018-12-20 09:05:54 【问题描述】:

我正在尝试在 Anaconda 3 中使用 Sage,但似乎没有导入库。

我首先创建了一个新环境“ipykernel_py2”,然后按照here 中的说明安装了 Python 2。有了这个,我可以在 Anaconda 3 中启动并运行 Python 3 和 Python 3。

然后我转到创建的内核文件夹(C:\Users\YOUR_USERNAME\AppData\Local\Continuum\anaconda3\envs\ipykernel_py2\share\jupyter\kernels)并粘贴 Sage 的内核(取自 C:\Program Files\ SageMath 8.2\runtime\opt\sagemath-8.2\local\share\jupyter\kernels)。这允许在 Jupyter 中创建新的 SageMath 文件,但内核已死。 为了激活内核,我使用了 Anaconda Prompt 并输入:

activate ipykernel_py2
python -m ipykernel install --user --name sagemath --display-name "SageMath 8.2"

现在内核已激活,我可以创建和运行 Sage 文件。但是,图书馆仍然无法正常工作。该文件似乎像普通的 Python 2 文件一样运行。

有谁知道如何解决这个问题?我需要创建一个单独的环境吗?

【问题讨论】:

【参考方案1】:

Sage for Windows 在名为 Cygwin 的 UNIX 仿真环境下运行。查看 sagemath/kernel.json 它包含:

"display_name": "SageMath 8.2", "argv": ["/opt/sagemath-8.2/local/bin/sage", "--python", "-m", "sage.repl.ipython_kernel", "-f", "connection_file"]

您可以在此处看到它具有指向sage 可执行文件的UNIX 样式路径。这条路径只对在 Sage 的 Cygwin 环境下运行的其他程序有意义,对原生 Windows 程序没有意义。简单地将其转换为等效的 Windows 路径也不起作用,因为 bin/sage 实际上是一个 shell 脚本。至少您需要为 Cygwin 附带的 bash 提供 Windows 路径,并将 UNIX 路径传递给 sage 可执行文件(与上面那个)。如果没有登录 shell,也不会设置所需的大多数环境变量,因此您可能需要bash -l

所以,类似:

"display_name": "SageMath 8.2", "argv": ["C:\\Program Files\\SageMath 8.2\\runtime\\bin\\bash.exe", "-l", "/opt/sagemath-8.2/local/bin/sage", "--python", "-m", "sage.repl.ipython_kernel", "-f", "connection_file"]

可能有效。我不确定的一件事是 connection_file 参数是否也会得到正确处理。我没有测试过。

更新:确实,上述部分可行,但存在一些问题:connection_file 参数作为文件的绝对 Windows 路径传递。虽然 Cygwin 通常可以透明地从 Windows 路径转换为相应的 UNIX 路径,但有一个 known issue 表明 Cygwin 上的 Python 的 os.path 模块不能很好地处理 Windows 样式的路径,这会导致问题。

我遇到的另一个主要问题是,驱动通用 Jupyter 内核的类 IPKernelApp 有一个线程来轮询内核的父进程(在本例中为笔记本服务器)是否已退出,因此它可以适当地如果父级关闭,则关闭。这就是内核知道在您终止笔记本服务器时自动关闭的方式。

如何做到这一点因平台而异——Windows 与类 UNIX。因为 Sage 的内核在 Cygwin 中运行,所以它选择了类 UNIX 轮询器。但是,如果笔记本服务器恰好是本机 Windows 进程,则这是错误的,例如在 Windows 本机 Jupyter 中运行 Sage 内核时。值得注意的是,parent poller for Windows 可以 在 Cygwin 上同样有效,因为它通过 ctypes 访问 Windows API。因此,可以通过为IPKernelApp 提供一个强制使用ParentPollerWindows 的包装器来解决此问题。

一个可能的解决方案看起来像这样:在 SageMath Shell 中执行:

$ cd "$SAGE_LOCAL"
$ mkdir -p ./share/jupyter/kernels/sagemath
$ cd ./share/jupyter/kernels/sagemath
$ cat <<_EOF_ > kernel-wrapper.sh
#!/bin/sh
here="$(dirname "$0")"
connection_file="$(cygpath -u -a "$1")"
exec /opt/sagemath-8.2/local/bin/sage --python "$here/kernel-wrapper.py" -f "$connection_file"
_EOF_
$ cat <<_EOF_ > kernel-wrapper.py
from ipykernel.kernelapp import IPKernelApp as OrigIPKernelApp
from ipykernel.parentpoller import ParentPollerWindows
from sage.repl.ipython_kernel.kernel import SageKernel


class IPKernelApp(OrigIPKernelApp):
    """
    Although this kernel runs under Cygwin, its parent is a native Windows
    process, so we force use of the ParentPollerWindows.
    """

    def init_poller(self):
        if self.interrupt or self.parent_handle:
            self.poller = ParentPollerWindows(self.interrupt,
                                              self.parent_handle)


IPKernelApp.launch_instance(kernel_class=SageKernel)
_EOF_

现在将kernel.json(在share\jupyter\kernels\sagemath下的现有位置)编辑为:

"display_name": "SageMath 8.2", "argv": ["C:\\Program Files\\SageMath 8.2\\runtime\\bin\\bash.exe", "-l", "/opt/sagemath-8.2/local/share/jupyter/kernels/sagemath/kernel-wrapper.sh", "connection_file"]

这运行kernel-wrapper.sh,而后者又运行kernel-wrapper.py。 (我可以做一些简化来完全摆脱对kernel-wrapper.sh 的需求,但在包含PyCygwin 的SageMath 8.3 中这会更容易。)

确保将每个“8.2”更改为适合您的 Sage 安装的“X.Y”版本。

更新:感谢用户的反馈进行了一些更新,但我尚未测试这些更改,因此请确保不要盲目复制/粘贴我的每个文件/目录路径说明存在并且看起来正确。

如您所见,这并非微不足道的事情,而且在设计上绝不是为了实现这一点。但这是可以完成的。一旦内核本身启动并运行,它只需通过 TCP/IP 套接字与其通信,因此之后不会涉及太多魔法。我相信在 Jupyter 方面和 Sage 方面都可以进行一些小的改进,这将有助于未来的这类事情......

【讨论】:

出于好奇,我尝试了它,它几乎可以正常工作,但我担心的是 connection_file 被正确传递。让我看看我是否想不出解决方法... 我能够在整个事情周围放置一个包装脚本,以处理映射连接文件文件名,这似乎有效。然而,现在似乎还有另一个问题,笔记本似乎认为内核已经死了,即使它不是。这很有趣,因为如果我自己直接运行内核(使用手动连接文件名),然后使用jupyter run 将命令传递给它,它就可以工作。所以也许还有一些关于流程管理的其他混乱...... 感谢您的详细解答@Iguananaut。不幸的是,我恐怕无法实现它,因为我是一个基本的 Python 用户,而且我的编程技能有限。看起来有一种方法可以做到(正如你所解释的那样),但对于基本用户来说太麻烦了。我会像以前一样继续使用我的 SageMath shell。 我建议还是试试看。我给了你几乎完全相同的命令来运行,如果你这样做,它应该可以工作。注意,sage 还自带笔记本……

以上是关于如何在 Anaconda 中安装 SageMath 内核?的主要内容,如果未能解决你的问题,请参考以下文章

在 Anaconda 中安装 Kivy

如何在 Windows 上的 Anaconda Python 中安装 Keras 和 Theano?

如何在 conda 环境中安装 libsvm,以便可以在 anaconda 中导入 svm?

在 jupyter notebook 中安装 Rdkit,使用 Anaconda 环境

在Windows10 + Anaconda中安装pip3工具

如何在anaconda虚拟环境中安装多个版本的CUDA,cudnn,pytorch,torchvision,torchaudio及进行环境配置手把手教学