Doom-emacs: [BUG] ob-async с emacs-jupyter

Созданный на 16 дек. 2019  ·  30Комментарии  ·  Источник: hlissner/doom-emacs

Чего вы ожидали?
См. Вывод исходного блока в разделе результатов

Что на самом деле произошло?
Он выводит правильно в первый раз, но затем выводит код ob-async

Дополнительные детали:
image

Обратная трассировка:

Debugger entered--Lisp error: (file-missing "Cannot open load file" "No such file or directory" "ob-jupyter-python")
  signal(file-missing ("Cannot open load file" "No such file or directory" "ob-jupyter-python"))
  async-handle-result((lambda (result) (with-current-buffer #<buffer google_maps.org> (let ((default-directory "/home/pim/git/myMinsait/smartwaste/sprint20/")) (save-excursion (cond ((member "none" ...) (message "result silenced")) ((member "silent" ...) (message ...)) (t (goto-char #<marker at 692 in google_maps.org>) (let ... ... ... ...))) (run-hooks 'org-babel-after-execute-hook))))) (async-signal (file-missing "Cannot open load file" "No such file or directory" "ob-jupyter-python")) #<buffer *emacs*>)
  async-when-done(#<process emacs> "finished\n")

Действия по воспроизведению:

  1. Добавить jupyter в packages.el (package! jupyter)
  2. Иметь рабочую среду jupyter
  3. Запустить код, как на скриншоте, в орг-файле
#+begin_src jupyter-python :session py :results raw drawer
%matplotlib inline
import numpy as np
import pandas as pd
x = np.linspace(1,100, 10)
y = np.random.normal(size=10)*x
df = pd.DataFrame({'x':x, 'y':y})
df.plot(x='x', y='y')
#+end_src

Системная информация:

Compiling your literate config...
Tangled 0 code blocks from config.org

Done!
((emacs
  (version . "27.0.50")
  (features . "XPM JPEG TIFF GIF PNG RSVG CAIRO SOUND GPM DBUS GLIB NOTIFY INOTIFY ACL GNUTLS LIBXML2 FREETYPE HARFBUZZ LIBOTF ZLIB TOOLKIT_SCROLL_BARS GTK3 X11 XDBE XIM MODULES THREADS LIBSYSTEMD JSON PDUMPER LCMS2 GMP")
  (build . "dic 05, 2019")
  (buildopts "--prefix=/usr --sysconfdir=/etc --libexecdir=/usr/lib --localstatedir=/var --mandir=/usr/share/man --with-gameuser=:games --with-sound=alsa --with-modules --without-gconf --without-gsettings --enable-link-time-optimization --with-x-toolkit=gtk3 --without-xaw3d --without-m17n-flt --with-cairo --without-compress-install 'CFLAGS=-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong -fno-plt -flto -fuse-linker-plugin -flto -fuse-linker-plugin -fuse-ld=gold' CPPFLAGS=-D_FORTIFY_SOURCE=2 LDFLAGS=-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now")
  (windowsys . batch)
  (daemonp . server-running))
 (doom
  (version . "2.0.9")
  (build . "HEAD -> develop 207ce02a3 2019-12-16 05:45:27 -0500"))
 (system
  (type . gnu/linux)
  (config . "x86_64-pc-linux-gnu")
  (shell . "/usr/bin/zsh")
  (uname . "Linux 4.19.88-1-MANJARO #1 SMP PREEMPT Thu Dec 5 11:04:44 UTC 2019 x86_64")
  (path "~/anaconda3/envs/waste/bin" "~/anaconda3/condabin" "~/.local/bin" "/usr/local/bin" "/usr/local/sbin" "/usr/bin" "/usr/lib/jvm/default/bin" "/usr/bin/site_perl" "/usr/bin/vendor_perl" "/usr/bin/core_perl" "/usr/lib/emacs/27.0.50/x86_64-pc-linux-gnu"))
 (config
  (envfile . envvar-file)
  (elc-files . 0)
  (modules :completion company ivy :ui doom doom-dashboard doom-quit hl-todo modeline nav-flash ophints (popup +all +defaults) treemacs vc-gutter vi-tilde-fringe window-select workspaces :editor (evil +everywhere) file-templates fold multiple-cursors rotate-text snippets word-wrap :emacs dired electric ibuffer vc :term eshell :tools docker (eval +overlay) flycheck (lookup +docsets) lsp magit :lang data emacs-lisp markdown (org +dragndrop +ipython +pandoc +present) (python +lsp +conda) sh :config literate (default +bindings +smartparens))
  (packages jupyter)
  (elpa "n/a")))

:lang org new resolved-temporarily

Все 30 Комментарий

Попробуйте добавить это в свой личный config.el:

(add-hook! '+org-babel-load-functions
  (defun +org-babel-load-jupyter-h (lang)
    (and (string-prefix-p "jupyter-" (symbol-name lang))
         (require lang nil t))))

Спасибо за быстрый ответ. К сожалению, это не исправляет.

Я также пробовал с более простым блоком кода:

#+begin_src jupyter-python :session py :results raw drawer
print('test')
#+end_src

#+RESULTS:
: test

#+begin_src jupyter-python :session py :results raw drawer
print('test')
#+end_src

#+RESULTS:
: c172bf02f62c4210de534c8e3147198b

Вот моя текущая конфигурация («новый пользователь»):

;;; .doom.d/config.el -*- lexical-binding: t; -*-

;; Place your private configuration here

(def-package! org
  :config
  ;; (setq python-shell-interpreter "/home/pim/anaconda3/bin/python3")
  ;; (setq org-babel-python-command "/home/pim/anaconda3/bin/python3")
  (setq python-shell-interpreter-args "-m IPython --simple-prompt -i")
  (org-babel-do-load-languages
   'org-babel-load-languages
   '((latex . t)
     (python . t)
     (shell . t)
     (sql . t)
     (jupyter . t))))

(add-hook! '+org-babel-load-functions
  (defun +org-babel-load-jupyter-h (lang)
    (and (string-prefix-p "jupyter-" (symbol-name lang))
         (require lang nil t))))

Удалите вызов org-babel-do-load-languages . Это избыточно с собственным механизмом отложенной загрузки Doom для плагинов babel. Не уверен, что это решит вашу проблему, но может.

В противном случае попробуйте вместо этого переключиться с пакета jupyter на :lang (org +ipython) . Вероятно, пакет jupyter emacs делает что-то нестандартное.

Также попробуйте добавить :async yes или :async no в свои блоки src и посмотрите, имеет ли это значение.

Проблема с ob-ipython заключается в том, что я не могу использовать среду, активированную с помощью + conda. Также ob-ipython, похоже, теряет поддержку.

Я хотел попробовать emacs-jupyter, так как по умолчанию он мог использовать среду conda, а также потенциально использовать R и удаленные ядра.

Как мне добавить jupyter в org babel, если не с org-babel-do-load-languages ?

emacs-jupyter не использует ob-async . Для правильной работы jupyter необходимы следующие настройки.

(setq ob-async-no-async-languages-alist
      '("jupyter-python"))

Я добавил функцию +jupyter в :lang org которая устанавливает ob-async-no-async-languages-alist и +org-babel-load-functions . Сообщите мне, если это решит вашу проблему.

Спасибо @randomizedthinking и @hlissner за вашу помощь.

После добавления +jupyter в конфигурацию организации .doom.d/init.el, it seems babel does not pick up that language: org-babel-execute-src-block: Нет функции org-babel-execute для jupyter-python!

Кроме того, emacs-jupyter можно использовать в качестве прямого ответа для файлов Python. Это не просто интеграция с org-режимом, как у ob-ipython. По правде говоря, я новичок в doom / emacs и почти не использовал emacs-jupyter, но я мог видеть, что реплики, предоставляемые emacs-jupyter, намного лучше, обеспечивая мощное автозаполнение, поддержку изображений в буфере и т. Д. .

Все это, чтобы спросить, заслуживает ли emacs-jupyter своей установки как части модуля python?

Хотя у меня очень ограниченные знания, я готов помочь в этом любым возможным способом.

Между тем, я добавил это в свой файл конфигурации:

(use-package! jupyter
  :defer t
  :init
  (map! :after python
        :map python-mode-map
        :localleader
        (:prefix ("j" . "jupyter")
          :desc "Run REPL"      "o" #'jupyter-run-repl
          :desc "Eval funciton"      "f" #'jupyter-eval-defun
          :desc "Eval buffer"      "b" #'jupyter-eval-buffer
          :desc "Eval region"      "r" #'jupyter-eval-region
          :desc "Restart REPL"      "R" #'jupyter-repl-restart-kernel
          :desc "Interrupt REPL"      "i" #'jupyter-repl-interrup-kernel
          :desc "Scratch buffer"      "s" #'jupyter-repl-scratch-buffer
          :desc "Remove overlays"      "O" #'jupyter-eval-remove-overlays
          :desc "Eval string"      "w" #'jupyter-eval-string
          :desc "Inspect at point"      "d" #'jupyter-inspect-at-point
          )))

На данный момент это работает хорошо.

Только интеграция с orgmode вроде сломана.

@pmercatoris Для того, чтобы jupyter работал в org-babel, мои текущие настройки следующие. Согласно документу emacs-jupyter, язык python (или любые другие языки, которые мы планируем использовать с jupyter) должен быть включен перед jupyter .

(org-babel-do-load-languages
 'org-babel-load-languages
 '((shell . t)
   (emacs-lisp . t)
   (python . t)
   (jupyter . t)))

Во-вторых, было бы здорово, если бы emacs-jupyter был интегрирован в платформу doom emacs.

Также спасибо за то, что поделились сочетаниями клавиш. Для всех функций оценки мы можем использовать текущий doom gr operator - это будет согласованный cross doom repl.

@pmercatoris Посмотрите, решит ли 17d0833 вашу проблему.

Если это не сработает, посмотрите, поможет ли переопределение +org-babel-load-jupyter-h следующим образом:

(defun +org-babel-load-jupyter-h (lang)
  (and (string-prefix-p "jupyter-" (symbol-name lang))
       (require 'ob-python)
       (require lang nil t)))

@randomizedthinking Пожалуйста, попробуйте без org-babel-do-load-languages . Он был отключен в 3b2a37d9a, потому что в любом случае он мешает ленивому загрузчику Doom.

@hlissner ни 17d0833, ни переопределение, похоже, не работают.

Я получаю: org-babel-execute-src-block: No org-babel-execute function for jupyter-python! без выделения для исходного блока

Хорошо, я добавил это в .doom.d / config.el, и теперь он работает! :)

(add-hook! '+org-babel-load-functions
    (defun +org-babel-load-jupyter-h (lang)
      (and (string-prefix-p "jupyter-" (symbol-name lang))
       (require 'ob-jupyter)
           (require lang nil t))))

Единственное, что подсветка исходного блока не загружается при первом посещении файла. Мне нужно вернуться к нему после выполнения исходного блока. Это предназначено?

Отлично, я добавлю, что подмодуль + jupyter после того, как мы выясним вашу проблему с выделением блоков (это не предназначено, у нас есть ленивый загрузчик для выделения блоков, но jupyter - это очень необычно структурированный плагин babel).

Посмотрите, решит ли проблему добавление этого файла в config.el:

(after! org
  (defadvice! +org--src-lazy-load-library-a (lang)
    "Lazy load a babel package to ensure syntax highlighting."
    :before #'org-src--get-lang-mode
    (unless (cdr (assoc lang org-src-lang-modes))
      (or (run-hook-with-args-until-success '+org-babel-load-functions lang)
          (require (intern-soft (format "ob-%s" lang)) nil t)
          (require lang nil t)))))

Хорошо. Но он продолжает вести себя так же, как показано ниже:

Как это при первом посещении файла
image

Выполните ячейку и повторно посетите файл:
image

Вы пробовали обновленный фрагмент? Я улучшил его вскоре после публикации.

Да, с обновленным сниппетом. Вот мой config.el:

;;; .doom.d/config.el -*- lexical-binding: t; -*-

;; Place your private configuration here
;;

(setq python-shell-interpreter "ipython"
      python-shell-interpreter-args "--simple-prompt -i")

(after! org
  (defadvice! +org--src-lazy-load-library-a (lang)
    "Lazy load a babel package to ensure syntax highlighting."
    :before #'org-src--get-lang-mode
    (unless (cdr (assoc lang org-src-lang-modes))
      (or (run-hook-with-args-until-success '+org-babel-load-functions lang)
          (require (intern-soft (format "ob-%s" lang)) nil t)
          (require lang nil t)))))

(add-hook! '+org-babel-load-functions
  (defun +org-babel-load-jupyter-h (lang)
    (and (string-prefix-p "jupyter-" (symbol-name lang))
         (require 'ob-jupyter)
         (require lang nil t))))

;; Select window between frames
(after! ace-window
  (setq aw-scope 'global))

;;;
;;; Keybinds

(setq doom-localleader-key ",")

(use-package! jupyter
  :defer t
  :init
  (map! :after python
        :map python-mode-map
        :localleader
        (:prefix ("j" . "jupyter")
          :desc "Run REPL"      "o" #'jupyter-run-repl
          :desc "Eval funciton"      "f" #'jupyter-eval-defun
          :desc "Eval buffer"      "b" #'jupyter-eval-buffer
          :desc "Eval region"      "r" #'jupyter-eval-region
          :desc "Restart REPL"      "R" #'jupyter-repl-restart-kernel
          :desc "Interrupt REPL"      "i" #'jupyter-repl-interrupt-kernel
          :desc "Scratch buffer"      "s" #'jupyter-repl-scratch-buffer
          :desc "Remove overlays"      "O" #'jupyter-eval-remove-overlays
          :desc "Eval string"      "w" #'jupyter-eval-string-command
          :desc "Inspect at point"      "d" #'jupyter-inspect-at-point
          :desc "Associate buffer REPL"      "B" #'jupyter-repl-associate-buffer
          )))

С помощью приведенного выше кода попробуйте изменить +org-babel-load-jupyter-h на:

(defun +org-babel-load-jupyter-h (lang)
  (and (string-prefix-p "jupyter-" (symbol-name lang))
       (require (intern
                 (format "ob-%s"
                         (string-remove-prefix "jupyter-" (symbol-name lang))))
                nil t)
       (require 'ob-jupyter nil t)
       (require lang nil t)))

К сожалению, это тоже не работает.

В случае, если это может быть связано. Исходный блок выполняется только после 2 x Cc, Cc
Первый раз отвечает:

executing Jupyter-Python code block...
org-babel-jupyter-session-key: Need a valid session and a kernel to form a key

И второй раз работает:

executing Jupyter-Python code block...
Starting python3 kernel process...done
Requesting kernel info...done
Code block evaluation complete. [2 times]

Хотя, возможно, это правильное поведение, я подумал, что упомяну об этом.

Я только что написал несколько улучшений для jupyter в af948ca. Пожалуйста, обновите и дайте мне знать, решит ли это проблему (и удалите предложения +org-babel-load-functions и +org--src-lazy-load-library-a я вам давал).

Отлично, поэтому выполнение исходного блока теперь работает без каких-либо изменений в config.el.

Однако проблема с выделением остается.

Большое вам спасибо за вашу работу.

Я знаю, что нам нужно загрузить одну из библиотек jupyter, но я не знаю, какую и когда. Это было бы намного быстрее, если бы у меня была среда jupyter для тестирования. Возможно, каждый модуль должен включать файл nix, чтобы настроить минимально жизнеспособную среду для тестирования.

Во всяком случае, не могли бы вы попробовать это?

(defadvice! oh-god-please-fix-jupyter-please-oh-please (lang)
  :override #'+org-babel-load-jupyter-h
  (when (string-prefix-p "jupyter-" (symbol-name lang))
    (let ((lang (string-remove-prefix "jupyter-" (symbol-name lang))))
      (unless (assoc lang org-src-lang-modes)
        (require (intern (format "ob-%s" lang))
                 nil t)))
    (with-demoted-errors "Jupyter: %s"
      (require 'jupyter nil t)
      (require lang nil t)
      (require 'ob-jupyter nil t))))

oh-god-please-fix-jupyter-please-oh-please haha, похоже, не очень компромисс, так как у меня все еще такое же поведение :-(

Ничего не знаю о Nix, но определенно звучит неплохо.

Может ли это быть связано с этим комментарием?

Обратите внимание: jupyter следует добавлять в качестве последнего элемента при загрузке языков, поскольку он зависит от значений таких переменных, как org-src-lang-Mode и org-babel-tangle-lang-exts. После загрузки ob-jupyter станут доступны новые блоки исходного кода с именами вида jupyter-LANG. LANG может быть любым из языков ядра, имеющихся в вашей системе. См. Спецификации jupyter-available-kernels. (Https://github.com/dzop/emacs-jupyter#org-mode-source-blocks)

Может ли это быть связано с этим комментарием?

Это так, но я обратил на это внимание с помощью +org-babel-load-jupyter-h , но он все равно отказывается работать. Итак, давайте попробуем еще раз:

(defadvice! oh-god-please-fix-jupyter-please-oh-please (lang)
  :override #'+org-babel-load-jupyter-h
  (when (string-prefix-p "jupyter-" (symbol-name lang))
    (let* ((lang-name (symbol-name lang))
           (lang-tail (string-remove-prefix "jupyter-" lang-name)))
      (and (not (assoc lang-tail org-src-lang-modes))
           (require (intern (format "ob-%s" lang-tail))
                    nil t)
           (add-to-list 'org-src-lang-modes (cons lang-name (intern lang-tail)))))
    (with-demoted-errors "Jupyter: %s"
      (require lang nil t)
      (require 'ob-jupyter nil t))))

Если это не сработает, мы просто прибегнем к глупому решению:

(after! ob-jupyter
  (dolist (lang '(python julia R))
    (cl-pushnew (cons (format "jupyter-%s" lang) lang)
                org-src-lang-modes :key #'car)))

Я знаю, что это сработает, но мне придется полагаться на людей, которые расширят этот список, поскольку jupyter вводит больше языков.

Так что, видимо, даже тупое решение для подсветки не работает. Но что еще более важно, похоже, что org-edit-special не будет работать, поскольку оно возвращается:
org-edit-src-code: No such language mode: jupyter-python-mode

Я очень надеюсь, что попробовал все правильно, поскольку я сказал, что я новичок в doom, но обязательно сделал doom refresh после любых изменений.

Ой, ой. Не могли бы вы снова попробовать мое глупое решение с (after! org-src ...) вместо (after! ob-jupyter ...) ?

Все работает, насколько я могу судить !! : D

Выделение, выполнение блока и специальное редактирование. Так что я не уверен, что вы думаете о решении, но очень рад, что оно работает :)

Спасибо!!

Привет! Я думаю, что что-то здесь могло нарушить поддержку R в орг-режиме с использованием плагина Jupyter. Выполнение блоков jupyter-python отлично работает:
Screen Shot 2020-02-13 at 2 01 09 PM
Но выполнение блоков jupyter-R не делает:
Screen Shot 2020-02-13 at 2 02 10 PM
Любой совет о том, как действовать?

@mbosley https://github.com/hlissner/doom-emacs/pull/2477 , скорее всего, решит вашу проблему.

А пока я закрою эту ветку, так как проблема с OP была решена.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги