在Emacs Python Shell中重新加载已更改的Python文件
在emacs的Python环境中(我用的是2.*版本的Python),我正在导入一个我正在处理的.py文件并测试代码。不过,如果我修改了代码,我不太确定该怎么再次导入它。
根据我目前的了解,
reload(modulename)
应该可以工作,但似乎并没有。
也许直接关闭Python环境再重新启动就可以了,不知道有没有什么命令可以做到,还是说只能手动操作?
补充:看起来python-send-defun和python-send-buffer是最理想的选择,但修改的内容似乎没有更新过来。
3 个回答
经过长时间的研究这个问题,我得出的结论是,最好的解决办法是基于你的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
虽然 reload()
可以用,但它不会改变对类、函数和其他对象的引用,所以你可能会看到旧版本的内容。一个更可靠的解决办法是用 exec
来替代 reload()
(这意味着一开始就不要用 import
),或者完全重启解释器。
如果你还是想继续使用 reload
,那么在引用那个模块里的东西时要非常小心,最好总是使用完整的名称。比如说,使用 import module
,然后用 module.name
,而不是 from module import name
。即使你很小心,还是可能会遇到旧对象的问题,这也是为什么 reload()
在 3.x 版本中没有的原因之一。
看起来对我来说是有效的:
在你的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