Python 如何在Anaconda中安装SageMath内核?

Python 如何在Anaconda中安装SageMath内核?,python,anaconda,jupyter,sage,jupyter-kernel,Python,Anaconda,Jupyter,Sage,Jupyter Kernel,我试图在Anaconda3中使用Sage,但看起来库没有导入 我首先创建了一个新环境“ipykernel_py2”,然后安装了Python 2,如中所述。有了这个,我可以让Python 3和Python 3在Anaconda3中运行起来 然后我转到创建的内核文件夹(C:\Users\YOUR\u USERNAME\AppData\Local\Continuum\anaconda3\envs\ipykernel\u py2\share\jupyter\kernels)并粘贴Sage的内核(取自C:

我试图在Anaconda3中使用Sage,但看起来库没有导入

我首先创建了一个新环境“ipykernel_py2”,然后安装了Python 2,如中所述。有了这个,我可以让Python 3和Python 3在Anaconda3中运行起来

然后我转到创建的内核文件夹(C:\Users\YOUR\u USERNAME\AppData\Local\Continuum\anaconda3\envs\ipykernel\u py2\share\jupyter\kernels)并粘贴Sage的内核(取自C:\Program Files\SageMath 8.2\runtime\opt\SageMath-8.2\Local\share\jupyter\kernels)。这允许在Jupyter中创建新的SageMath文件,但内核已经死了。 为了激活内核,我使用Anaconda提示符并键入:

activate ipykernel_py2
python -m ipykernel install --user --name sagemath --display-name "SageMath 8.2"
所以内核现在被激活了,我可以创建和运行Sage文件。然而,这些库仍然不起作用。该文件的运行方式似乎与普通的Python2文件类似


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

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路径,并将其传递给
sage
可执行文件的UNIX路径(与上面的路径相同)。如果没有登录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\u file}
参数是否会被正确处理。我还没有测试过

更新:确实,上述方法部分有效,但存在一些问题:
{connection\u file}
参数作为文件的绝对Windows路径传递。虽然Cygwin通常可以透明地从Windows路径转换到相应的UNIX路径,但有一个问题是Cygwin上Python的
os.path
模块不能很好地处理Windows样式的路径,这导致了一些问题

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

如何实现这一点取决于平台的不同——Windows和UNIX之类的平台。因为Sage的内核在Cygwin中运行,所以它选择了类UNIX的轮询器。但是,如果笔记本服务器恰好是一个本机Windows进程,这是错误的,就像在Windows本机Jupyter中运行Sage内核一样。值得注意的是,可以在Cygwin上同样工作,因为它通过
ctypes
访问Windows API。因此,可以通过向
IPKernelApp
提供一个包装器来解决这一问题,该包装器强制使用
ParentPollerWindows

一个可能的解决方案如下所示:从SageMath Shell中执行以下操作:

$ cd ~
$ mkdir -p ./local/share/jupyter/kernels/sagemath
$ cd ./local/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 wrapper.sh
,它依次运行
kernel wrapper.py
。(我可以做一些简化,完全不需要
内核包装器.sh
,但在SageMath 8.3中这会更容易,其中包括。)


正如你所看到的,这并不是一件小事,也从来没有被设计成可能。但这是可以做到的。一旦内核本身启动并运行,就只需要通过TCP/IP套接字与它对话,这样就不会有太多的魔力了。我相信在Jupyter和Sage方面都可以做一些小的改进,这将有助于将来实现这类事情……

出于好奇,我尝试了它,它几乎可以工作,但正如我担心的那样,
{connection\u file}
被正确传递。让我看看我是否能想出一个解决办法……我能够在整个过程中加入一个包装器脚本,以处理映射连接文件名的问题,这似乎是可行的。然而,现在出现了另一个问题,笔记本电脑似乎认为内核已经死了,即使它没有死。这很有趣,因为如果我自己直接运行内核(使用手动连接文件名),然后使用
jupyter run
将命令传递给它,它就可以工作了。所以,也许还有一些关于流程管理的困惑……感谢您详细介绍的ansewr@Iguananaut。不幸的是,我恐怕无法实现它,因为我是一个基本的Python用户,并且编程技能有限。看起来有一种方法可以做到这一点(正如您所解释的),但对于基本用户来说,这种方法非常麻烦。我会像以前一样继续使用我的SageMath外壳。无论如何,我建议尝试一下。我给了你几乎完全正确的运行命令,如果你这样做了,它应该会工作。请注意,sage还附带笔记本。。。
{"display_name": "SageMath 8.2", "argv": ["C:\\Program Files\\SageMath 8.2\\runtime\\bin\\bash.exe", "-l", ".local/share/jupyter/kernels/sagemath/kernel-wrapper.sh", "{connection_file}"]}