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

7
在emacs Python shell中(我正在运行2.* Python),我正在导入一个.py文件并测试代码。但是如果我更改代码,我不确定如何重新导入它。
从我目前的阅读来看,似乎
reload(modulename)

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

或许只需要关闭Python shell并重新启动就足够了,有命令吗还是手动操作呢?

编辑:看起来python-send-defun和python-send-buffer会很理想,但更改似乎没有传播。

3个回答

15

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

如果您确实想继续使用reload,请非常小心地引用该模块中的内容,并始终使用完整名称。例如,使用import module并使用module.name而不是from module import name。即使小心谨慎,您仍将遇到旧对象的问题,这也是为什么reload()不在3.x中的原因之一。


1
这个注释中重要的是,你不仅需要重新加载模块,还需要基于“新”模块重新实例化对象。 - Jehiah
3
仅仅修复导入方式并不能使重新加载在一般情况下正常工作。如果您已经从导入的模块中存储了任何内容(例如类实例),它将不会被重新加载。为了使重新加载在一般情况下正常工作,您必须递归地重新加载所有使用该模块的用户。重新加载是脆弱的,我强烈建议在测试时不要使用它--调试时最后需要的是被部分重新加载所困扰,导致神秘的错误在重新启动shell后消失。 - Glenn Maynard

5

看起来对我有用:

创建一个文件(在PYTHONPATH中),名为test.py

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

谢谢,现在它完美地运行了,我可能之前做了一些奇怪的事情。 - justinhj
请注意,reload将优先从.pyc文件重新加载,如果可用的话。因此,如果您进行了更改但pyc文件没有被重建或删除,则您的更改不会出现在shell中。 - rogueleaderr
在CPython中,如果源文件比.pyc文件更新,reload会自动重新读取源文件。我现在找不到这个文档,但可以尝试一下 - 它有效。 - unutbu

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接