在emacs python shell中重新加载已更改的python文件

时间:2009-11-29 18:49:51

标签: python emacs

在emacs Python shell中(我正在运行2. * Python)我正在导入我正在使用的.py文件并测试代码。如果我更改代码,但我不知道如何再次导入它。

从我的阅读到现在为止似乎

reload(modulename)

应该有用,但似乎没有。

也许只是关闭python shell并重启它就足够了,是否有一个命令或你只是手动执行它?

编辑:看起来像python-send-defun和python-send-buffer是理想的,但是变化似乎没有传播。

3 个答案:

答案 0 :(得分:15)

虽然reload()确实有效,但它不会更改对类,函数和其他对象的引用,因此很容易看到旧版本。最一致的解决方案是将reload()替换为exec(这意味着首先不使用import)或完全重新启动解释器。

如果您确实想继续使用重新加载,请非常小心如何从该模块引用内容,并始终使用全名。例如。 import module并使用module.name代替from module import name。而且,即使小心,你仍然会遇到旧对象的问题,这是reload()不在3.x中的一个原因。

答案 1 :(得分:5)

这似乎对我有用:

创建一个名为test.py

的文件(在PYTHONPATH中)
def foo():
    print('bar')

然后在emacs python shell中(或者更好的是ipython shell),输入

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

现在修改test.py:

def foo():
    print('baz')

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

答案 2 :(得分:0)

在查看这个问题相当长的时间之后,我得出的结论是,实现的最佳解决方案是基于python解释器的初始化文件(例如ipython),或者使用python构建-in模块“imp”及其功能“重载”。例如,在代码的开头:

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