怎么样打造一个基于 spacemacs 使用ipython 和jupyter-notebook交互python的开发环境

系统mac os 10.12+ ,emacs 25.2 ,大家有什么好的资料或本身就是大神,烦请不吝赐教,补充一下 主要面向data science

@et2010 召唤术

1 个赞

响应号召,来献丑回答一下。

emacs 上有很多选择,关键看你要做什么

  • ein 只简单试用了一下,不太对我的口味,不多评价。
  • ob-ipython(以及基于它的 scimax ),主要优势在于 org markup,适合于不太长的代码块。写写文档,博客什么的。不然会很乱。
  • lpy 可以看作是 python-mode 下的 org-mode + ipython notebook。相比 ein 和 ob-ipython,主要优势是简单,随意切换进程。另外一个优势是开发者是个大神,响应很及时。缺点是暂时还不支持 async eval。

这三个我都用过,目前倾向于 lpy。因为不知道你的主要用途,不好瞎推荐。你可以都试试,应该很容易决定。这个帖子应该也可以给你提供一些思路:

另外,如果不考虑 emacs,可以在 jupyter notebook 上安装插件,实现 vim keybinding。

4 个赞

如果不是data science那种交互 其实python-mode自带的inferior-python-modelpy可以解决大多数需求了 可以顺便装上anaconda mode (spacemacs里好像自带了)

如果是data science的用法:

  1. 推荐安装 conda.el 一键切换conda environment
  2. ein 是emacs里和jupyter notebook交互的唯一选择 建议如果用jupyter notebook就别和org一块用了 感觉这俩的integration有点buggy
  3. ob-ipython 好处是轻便, 可以和org mode无缝衔接, 支持async eval, 代码不多 有啥功能没有可以自己hack (ein就别想了。。) 比如我就hack了一套自动使用指定remote server kernel 运行 code的workflow,另外还有一些整合ob-ipython 和 inferior-python-mode以及lpy的code 坏处是async机制不够robust
  4. lpy好处是abo-abo对代码编辑时候的需求很懂 各种功能都可以一键触发 非常带感 其实可以折腾一下作为python code编辑的主要工具
2 个赞

data science 的交互有什么特殊要求? async?还是远程?

这个赞同,只是我现在基本上用的原生的 lpy (spacemacs 下)。作为交互式 IDE 的话,不知道还可以往哪个方向折腾/优化?

async 远程 画图 文档吧

如果主要用lpy的话我觉得可以进一步优化的地方不太多了 可能就是和其他一些mode的整合吧 比如outshine 和inferior-Python-mode?

对我来说主要希望把lpy和org-edit-src-block结合的更好 比如用org mode specify的ipython kernel来负责lpy的eval

1 个赞

ob-ipython的async执行太buggy了,差不多是基本不可用的状态

确实很buggy。。不过我还是一直忍气吞声的用得很high😂

我都自己动手修了好几个bug了。但是输出一大速度巨慢这条还暂时无解。ob-ipython异步执行时每隔一定区间例如1K读取一次输入,然后尝试解析JSON看能不能输出一个答案。如果输出都是些文字那没问题,如果我输出一个800K的图片,那它就开始解析1K的JSON,失败,2K的JSON失败,3K的JSON,失败。。。。709K的JSON,失败,800K的JSON,OK输出,整个是O(N^2)复杂度 >_<

卧槽这样。。。不知道jupyter notebook是怎么处理的。。

你的图片是在json里用base64 string传回来的吗? 之前有遇到过这种情况 然后那个string还很长且不分行 导致emacs直接crash

但有时候好像没这个问题 我不确定是不是什么argument设置的区别 还是纯粹是图片大小的问题。。

图片都是json里的base64串。分不分行倒不是关键,这个process buffer是个binary的,也不在屏幕上显示。

你能不能感觉到这个慢,主要是和大小有关,因为这是个O(N^2)复杂度,所以随着图片大小增加,所需时间呈平方增长。

时间主要都是耗在ob-ipython–run-async里那个process filter里。其实这个filter可以整个注释掉,最后结果也会显示出来,因为ob-ipython在把这个json反复解析了几百遍以后最后在process sentinel里还要再解析一遍 (没错,这效率无敌了)。区别是没有process filter,如果你一把计算10个代码框,结果不会一个一个显示出来,而是最后一起出来。

感觉可以看看 Sunsetting Atom | The GitHub Blog 是怎么做的

Edit… 额好像和EIN差不多。。。可是EIN好慢= =

交互的话,今天才发现了这个:

可以<C-return>发送当前行或函数。

https://github.com/dzop/emacs-jupyter 这个比 ob-ipython 好用,而且 repl 支持格式比较多