代码之家  ›  专栏  ›  技术社区  ›  justinhj

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

  •  7
  • justinhj  · 技术社区  · 15 年前

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

    从我目前的阅读来看

    reload(modulename)
    

    应该可以,但似乎不行。

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

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

    3 回复  |  直到 7 年前
        1
  •  5
  •   unutbu    15 年前

    它似乎对我有用:

    制作一个名为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
  •  15
  •   Roger Pate    15 年前

    同时 reload() 确实有效,它不会更改对类、函数和其他对象的引用,因此很容易看到旧版本。最一致的解决方案是替换 重新加载() 用任一 exec (意思是不使用 import 或者完全重新启动解释器。

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

        3
  •  0
  •   Robin Tournemenne    7 年前

    在花了相当长的时间研究这个问题之后,我得出结论,要实现的最佳解决方案是,要么基于Python解释器的初始化文件(例如i python),要么使用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