Emacs中直接执行python代码的问题

大家在Emacs中调试python代码时有没有遇到这样一个问题:

比如test.py中import了另一个文件test1.py中的test1函数,在test.py中直接C-c C-c可以执行代码并调用test1.test1()函数,但每次修改test.py中的代码时会即时生效,修改test1.py中的代码时,并不会生效,必须用C-c C-p重新启动一个python的buffer才可以加载test1.py中的代码。

test.py:
import test1
test1.test()

test1.py:
def test():
    print 'test1'
  1. 在test.py中按C-c C-c ,输出test1
  2. 修改test1.py,print ‘test2’
  3. 在test.py中按C-c C-c,还是输出test1

我刚试了下,确实有这个问题,楼主解决了么?:slight_smile:

你应该交代清楚,是在什么模式下,C-c C-c绑定的是什么函数。

1 个赞

没有解决,这个问题发这里也一直没人关注。

python-mode

C-c C-c 绑定的是

It is bound to C-c C-c, <menu-bar> <Python> <Eval buffer>.

(python-shell-send-buffer &optional SEND-MAIN MSG)

好像是同样的问题,要用ipython来解决这个问题。

方法很多,除了改为 ipython 之外,还可以:

  • 方法1: 在 python 代码里强制 reload:

    import test1
    import imp          # 添加这
    imp.reload(test1)   # 两行
    test1.test()
    
  • 方法2: 重载 python-shell-send-buffer:

    用编程的方式实现类似手动 C-c C-p 重启一个 *Python* 的效果

1 个赞

不懂 Python,看起来跟 Emacs 没什么关系,你用 Python REPL 应该会有同样的问题。

  • 方法3: 使用 org-mode:

    #+BEGIN_SRC python :results output
    import test1
    test1.test()
    #+END_SRC
    
    #+RESULTS:
    : test2
    

    BEGIN_..END_之间按 C-c C-c 执行代码,自动加载 test1.py。如果你只是做些实验,这种方式更好。

    如果你只是想共享一些代码片段,连 module 都没有必要使用,可以参考之前的讨论: https://emacs-china.org/t/org-mode-ipython-src-block/2476/3

1 个赞

确实是这样。。。