在Emacs Python Shell中重新加载已更改的Python文件

7 投票
3 回答
6953 浏览
提问于 2025-04-15 16:30

在emacs的Python环境中(我用的是2.*版本的Python),我正在导入一个我正在处理的.py文件并测试代码。不过,如果我修改了代码,我不太确定该怎么再次导入它。

根据我目前的了解,

reload(modulename)

应该可以工作,但似乎并没有。

也许直接关闭Python环境再重新启动就可以了,不知道有没有什么命令可以做到,还是说只能手动操作?

补充:看起来python-send-defun和python-send-buffer是最理想的选择,但修改的内容似乎没有更新过来。

3 个回答

0

经过长时间的研究这个问题,我得出的结论是,最好的解决办法是基于你的Python解释器的初始化文件(比如ipython),或者使用Python内置的“imp”模块和它的“reload”函数。比如在你代码的开头:

import my_module
import imp
imp.reload(my_module)

#your code

这个解决方案是我从这个页面得到的: https://emacs.stackexchange.com/questions/13476/how-to-force-a-python-shell-to-re-import-modules-when-running-a-buffer

15

虽然 reload() 可以用,但它不会改变对类、函数和其他对象的引用,所以你可能会看到旧版本的内容。一个更可靠的解决办法是用 exec 来替代 reload()(这意味着一开始就不要用 import),或者完全重启解释器。

如果你还是想继续使用 reload,那么在引用那个模块里的东西时要非常小心,最好总是使用完整的名称。比如说,使用 import module,然后用 module.name,而不是 from module import name。即使你很小心,还是可能会遇到旧对象的问题,这也是为什么 reload() 在 3.x 版本中没有的原因之一。

5

看起来对我来说是有效的:

在你的PYTHONPATH目录下创建一个叫做test.py的文件

def foo():
    print('bar')

然后在emacs的python终端(或者更好的选择是ipython终端)里输入

>>> import test
>>> test.foo()
bar

现在修改test.py文件:

def foo():
    print('baz')

>>> reload(test)
<module 'test' from '/home/unutbu/pybin/test.py'>
>>> test.foo()
baz

撰写回答