在 emacs 里折腾 jupyter 的正确方式是什么

最近在上相关的课程,所以需要折腾一下环境(轻度使用)。

我看到有好几个包:

  • ein
  • emacs-jupyter
  • lpy

现在大家比较常用的 workflow 是什么的呢 :eyes:

1 个赞

第二个好用, 其他不了解, 反正我看大佬 Kitchin 也用

1 个赞

最多用vterm开个ipython

2 个赞

其它可能都不如jupyterlab架起来后xwidget连进去使用方便(单独的ipynb我推荐ein。

有一篇文章总结得很全面,可以根据自己的需求尝试一下,或许会有帮助。

而我目前既没采用 emacs-jupyter ,也没有用 ein,而是使用 Jupytext (Jupyter的插件)同步一份纯 Python 文件(因此会有 .ipynb.py 两个文件),然后在 Emacs 里面编辑、在网页端操作 Jupyter 来运行。

优势如下:

  1. 纯粹的 Python 代码,在 Emacs 里面补全、高亮、LSP 全是良好的;
  2. 无论在 Jupyter 网页端修改代码、还是在 Eamcs 里面修改代码,另一个文件都自动同步(但是在 Emacs 下需要 revert-buffer,而 Jupyter 也是需要一个 Reload,但都是一个快捷键的事);
  3. 我的 Jupyter 是搭建在服务器上的,所以关闭了 Emacs,可以持续运行。
4 个赞
  1. 编辑 ipynb 文件就使用 code-cells 包,该包内部会调用 jupytext 自动将 ipynb 转换成 python 文件,然后在退出 emacs 后自动将 py 文件转换成 ipynb 文件。在写 python 代码的时候,我使用自己写的一个简单的 wrapper,通过 vterm 启动 ipython 然后将代码发送到 ipython 进行交互。

  2. 使用 orgmode,这个时候可以使用 emacs-jupyter 包,该包提供了一个 org-babel 的环境来调用 jupyter-kernel。

  3. 使用 quarto 软件 和 markdown-mode 将基于 markdown 方言的纯文本编译(运行代码并插入输出,图片等)后生成 ipynb,或者是 latex 生成的 pdf 等等任意格式。

最后,不建议使用基于 poly-mode 开发的包,作者已经处于半放弃维护的状态,同时该包也有很多小 bug,尤其是 evil 用户使用体验会很差。

2 个赞

你的代码可以分享一下吗?我用 lpy,不是很好用。

找到了 GitHub - milanglacier/dotemacs: My personal emacs configuration 谢谢分享!

我直接用 Google Colab 在线写的,本地不安裝 python 环境

你去看 my-apps-autoloads.el 的 164-265 行。因为命令都是通过宏生成的,所以不好找它们的定义。

在运行jupyter-run-repl 时出现jupyter-session-with-random-ports: jupyter kernel failed to show connection file path的问题? 设置如下:


(use-package jupyter
  ;; :elpaca t
  :init
  (org-babel-do-load-languages
   'org-babel-load-languages
   (append org-babel-load-languages '((jupyter . t))))
  (org-babel-jupyter-override-src-block "python")
  (setq org-babel-default-header-args:jupyter-python '((:async . "yes")
                                                       (:session . "py")
                                                       (:kernel . "base"))))
(use-package code-cells
  :config
  (setq code-cells-convert-ipynb-style '(("pandoc" "--to" "ipynb" "--from" "org")
					 ("pandoc" "--to" "org" "--from" "ipynb")
					 org-mode))
(add-hook 'python-mode-hook 'code-cells-mode-maybe)
(with-eval-after-load 'code-cells
  (let ((map code-cells-mode-map))
    (define-key map (kbd "M-p") 'code-cells-backward-cell)
    (define-key map (kbd "M-n") 'code-cells-forward-cell)
    (define-key map (kbd "C-c C-c") 'code-cells-eval)
    ;; Overriding other minor mode bindings requires some insistence...
    (define-key map [remap jupyter-eval-line-or-region] 'code-cells-eval)))
           )

mac, [email protected]

你这个就是jupyter不在PATH里面吧。。。应该和你的配置没什么关系。

1 个赞

Screenshot 2024-04-09 at 17.52.25 弱弱问一下,reload 怎么设置?

我建议用Pants将Jupyter打包变成pex,然后再和Emacs做集成。

可以参考我的两次技术分享:

这边由一堆用Pants写的模板工程可以参考:

1 个赞

这么设置。

如果你找不到,可能是因为我设置之后才会出现,那请直接编辑 JSON 配置文件

1 个赞

jupyter 还是乖乖用web吧,对自己好点 :joy: 别为难自己

2 个赞

我直接用pandoc一键全部转成 orgmode, 用org-babel 慢慢的变成活在org里

确实需要直接编辑 JSON

https://jupyterlab.readthedocs.io/en/latest/user/commands.html#commands-list:~:text=docmanager%3Areload-,Reload%20from%20Disk,-docmanager%3Arename