2009-11-29 52 views
7

在emacs Python shell(我正在运行2. * Python)中,我正在导入正在处理的.py文件并测试代码。如果我更改了代码,但是我不确定如何再次导入它。重新加载emacs python shell中已更改的python文件

从我读到目前为止似乎

reload(modulename) 

应该工作,但它似乎没有。

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

编辑:它看起来像python发送defun和python发送缓冲区将是理想的,但变化似乎并没有传播。

回答

5

这似乎为我工作:

做一个文件(在你的PYTHONPATH)被称为test.py

def foo(): 
    print('bar') 

然后在emacs的蟒蛇壳(或更好,但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 
+0

感谢它现在完美的作品,我一定会做一些奇怪的事情。 – justinhj 2009-11-29 20:18:08

+0

请注意,重新加载将优先从.pyc文件重新加载(如果可用)。因此,如果您进行了更改,但pyc文件不会被重建或删除,您的更改将不会显示在shell中。 – rogueleaderr 2013-02-06 19:43:47

+0

在CPython中,如果源文件比.pyc文件更新,'reload'会自动重新读取源文件。我现在无法在文档中找到它,但试试它 - 它可以工作。 – unutbu 2013-02-06 20:03:09

15

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

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

+1

在此评论的重要事情是,你不仅要重新加载模块,而且还根据“新”模块重新实例化对象 – Jehiah 2009-11-29 19:13:34

+3

只需修复导入方式,在一般情况下不会重新加载。如果您从导入的模块中存储了任何内容(例如类实例),则不会重新加载。要重新加载工作,您必须递归地重新加载所有用户。重新加载是脆弱的,我强烈建议不要在测试时使用它 - 任何人在调试时需要的最后一件事情是部分重新加载,导致在重新启动shell时会消失的神秘错误。 – 2009-11-29 21:30:06

0

看了这个问题的时间相当长,我得出结论认为最好的解决方案是基于python解释器的初始化文件(ipython for example),或者使用python build-在模块“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