首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Anaconda中安装SageMath内核?

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

Stack Overflow用户
提问于 2018-07-12 08:12:21
回答 1查看 5.5K关注 0票数 4

我试图在Anaconda 3中使用Sage,但是看起来库不是导入的。

我首先创建了一个新的环境'ipykernel_py2‘,然后安装了Python2,在这里中解释了这一点。有了这个,我就可以在Anaconda 3中启动和运行Python 3和Python 3。

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

代码语言:javascript
复制
activate ipykernel_py2
python -m ipykernel install --user --name sagemath --display-name "SageMath 8.2"

所以内核现在被激活了,我可以创建和运行Sage文件。然而,图书馆仍然无法工作。看起来,该文件运行起来就像一个普通的Python 2文件。

有人知道怎么解决这个问题吗?我需要创建一个独立的环境吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-12 15:03:24

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

代码语言:javascript
复制
{"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可执行文件(与上面的路径相同)。如果没有登录shell,所需的大多数环境变量也不会被设置,因此您可能需要bash -l

所以,就像:

代码语言:javascript
复制
{"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}参数。虽然Cygwin通常可以透明地从Windows路径转换到相应的UNIX路径,但是已知问题上的os.path模块不能很好地处理Windows样式的路径,这就导致了问题。

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

根据平台--Windows与UNIX--的不同,这是非常不同的。因为Sage的内核运行在Cygwin中,所以它选择了类似UNIX的poller。但是,如果笔记本服务器碰巧是一个本地Windows进程,这是错误的,就像在Windows本机木星中运行Sage内核时一样。值得注意的是,用于Windows的父计票器可以在Cygwin上工作得很好,因为它通过ctypes访问Windows。因此,可以通过向IPKernelApp提供一个强制使用ParentPollerWindows的包装器来解决这个问题。

然后,一个可能的解决方案如下所示:从SageMath Shell中执行:

代码语言:javascript
复制
$ 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下的现有位置)如下:

代码语言:javascript
复制
{"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的需求,我可以做一些简化,但是在SageMath 8.3中,这会更容易一些,其中包括PyCygwin。)

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

更新:由于用户的反馈,进行了一些更新,但我还没有测试这些更改,所以请确保我的指令中的每个文件/目录路径都存在并且看起来是正确的,而不是盲目地复制/粘贴。

正如您所看到的,这并不是微不足道的,而且从设计上来说,这是不可能的。但这是可以做到的。内核一旦启动并运行,就只需要通过TCP/IP套接字与其对话,因此之后就不会有太多的魔法了。我相信在木星和智者方面都可以做一些小小的改进,这将有助于将来的这类事情.

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51300460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档