ob-ipython:报错json-readtable-error 69

ob-ipython里面运行ipython代码块时,会报错json-readtable-error。打开debug-on-error之后看到Debugger entered–Lisp error: (json-readtable-error . 69)。

在ob-ipython的issue里面找过。说是没有jupyter。可是打开后台进程可以看到jupyter已经启动。

有时把:session去掉会正常运行。有时又要把:session加上才行。多数时候只会报这个错。无法运行。摸不着头脑。

有谁知道这个问题是怎么回事吗?

附上系统信息:

  • OS: archlinux
  • Emacs: 27.0.50
  • Spacemacs: 0.300.0
  • Spacemacs branch: develop (rev. 6a724e416)

spacemacs以及所有包都是最新版本。

下面这个评论认为 ob-ipython 本身就有 Bug,并给出了临时解决方案,不知道对你有没有帮助。

1 个赞

多谢。我按这个issue的方法看了一下,问题不一样。可能是权限的问题,显示sqlite3.OperationalError: disk I/O error

应该是wsl的锅。sqlite会报这个错sqlite3.OperationalError: disk I/O error。解析json时buffer里面有这些错误信息,自然就报错json-readtable-error。https://github.com/Microsoft/WSL/issues/2395

问题解决了。对ob-ipython–execute-request做了一点修改。在解析json之前把错误信息删除。

  (defun ob-ipython--execute-request (code name)
    (with-temp-buffer
      (let ((ret (apply 'call-process-region code nil
                        (ob-ipython--get-python) nil t nil
                        (list "--" ob-ipython-client-path "--conn-file" name "--execute"))))
        (if (> ret 0)
            (ob-ipython--dump-error (buffer-string))
        ;; hack start
          (goto-char (point-min))
          (if (not (search-forward "Error in atexit" nil t))
              (search-forward "Error in atexit" nil t)
              (delete-region (line-beginning-position) (point-max))
            )
        ;; hack end
          (goto-char (point-min))
          (ob-ipython--collect-json)
          ))))

我直接在init.el里面加载这个函数。有没有更加优雅点的办法?我看到有用advice-add的。

advice可以在原函数的前后加一点东西,如果是在中间插入一点,好像只能重新defun了。

好。谢谢。那就这样吧。