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

2024-04-18 23:38:33 发布

您现在位置:Python中文网/ 问答频道 /正文

在emacs Python shell(我正在运行2.*Python)中,我正在导入一个正在使用和测试代码的.py文件。如果我改变了代码,但我不确定如何再次导入它。

从我目前的阅读来看

reload(modulename)

应该有用,但似乎不行。

也许仅仅关闭python shell并重新启动它就足够了,是否有一个用于此操作的命令,或者您只是手动执行它?

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


Tags: 文件代码py命令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

似乎对我有用:

在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

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

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

相关问题 更多 >