把Python interpreter 改成ipython 之后,如果不带session执行它会打印出所有的输入输出

在我把Python interpreter 改成ipython 之后,如果不带session执行它会打印出所有的输入输出,请问一下这是默认的行为吗?有办法只输出output吗?

在emacs -q下重现需要把shell interpreter 和babel Python command都设置为ipython

如果不把org babel Python command设置为ipython,如果在options 加了session, 则会出现

这也是我要改成ipython的原因(一个好像已经很久了的emacs bug)

总结一下,问题是如果interpreter 是Python那么在session模式下第一次启动时会有一个error , 如果将python 替换成ipython 没有error, 但是不开session时会打印所有输入。

复现步骤

直接用emacs -a启动

Problem 1:

#+begin_src emacs-lisp
    (org-babel-do-load-languages
     'org-babel-load-languages
     '((emacs-lisp . t)
       (python . t)))
  (setq python-shell-interpreter '"ipython3")
  (setq python-shell-interpreter-args '"--simple-prompt")
  (setq org-babel-python-command '"python3")
#+End_Src

#+Begin_src python :session :results output
P = 'Hello world'
print(P)
#+end_src

Problem 2:

#+begin_src emacs-lisp
    (org-babel-do-load-languages
     'org-babel-load-languages
     '((emacs-lisp . t)
       (python . t)))
  (setq python-shell-interpreter '"ipython3")
  (setq python-shell-interpreter-args '"--simple-prompt")
  (setq org-babel-python-command '"ipython --simple-prompt")
#+End_Src

#+Begin_src python :results output
P = 'Hello world'
print(P)
#+end_src

很抱歉之前没有说清楚

GNU Emacs 28.1 (build 2, aarch64-apple-darwin21.6.0, NS appkit-2113.60 Version 12.5 (Build 21G72)) MacOS

1 个赞
  1. 建议修改标题,用一句完整疑问句概括你的问题。
  2. 建议在 emacs -Q 上验证。
  3. 除了「把 Python interpreter 改成 ipython」还有哪些变化?最好整理一份最小配置,这样别人才能确切知道你改了什么。

没有用过org babel for python,但从这个网页的说明看, :results {output, value} : Output results come from whatever the python code prints on stdout. Value results are the value of the last expression evaluated in the code block. Value mode is the default (as with other languages). In value mode you can use the following subtypes: 如果改为value 可以么?

我已经 emacs -Q 验证过。

可以肯定楼主还有其他信息没有交代,这种情况下,猜测和讨论都没有意义。

1 个赞

抱歉,确实不是Emacs 的问题,应该是doom设置的问题.

我重新测试了一遍,可以在emacs -q下重现

贴出你的 -Q 配置和步骤。

把所有手动的步骤改为代码,保证别人也能复现。

根据你现在提供的信息,的确可以复现。

以下是我先前的验证步骤和结果,也是我说你信息没有交代完全的原因:

emacs -Q --eval "\
(progn
  (setq python-shell-interpreter \"ipython\")
  (org-babel-do-load-languages 'org-babel-load-languages '((python . t)))
  (switch-to-buffer \"*.org\")
  (org-mode)
  (insert \"\
#+BEGIN_SRC python :results output
  str='Hello, World'
  print(str)
#+END_SRC\"))" -nw

手动步骤:

  1. 运行以上命令
  2. C-c C-c

结果:

image

你的 Problem 1 这句有问题:

如果我没理解错,这里不应该用 ipythonipython 是用于增强交互体验的,执行代码直接 python 就好了。

Problem 2 用了 :session 在我电脑上会有警告:

Warning (python): Your ‘python-shell-interpreter’ doesn’t seem to support readline, yet ‘python-shell-completion-native-enable’ was t and “python3” is not part of the ‘python-shell
-completion-native-disabled-interpreters’ list. Native completions have been disabled locally.

确实是这样,我之所以用ipython是因为这样在session情况下就不会出警告

#+begin_src emacs-lisp
    (org-babel-do-load-languages
     'org-babel-load-languages
     '((emacs-lisp . t)
       (python . t)))
  (setq python-shell-interpreter '"ipython3")
  (setq python-shell-interpreter-args '"--simple-prompt")
  (setq org-babel-python-command '"ipython --simple-prompt")
#+End_Src

#+Begin_src python :session :results output
P = 'Hello world'
print(P)
#+end_src

#+RESULTS:
: Hello world