【问题标题】:Reloading a changed python file in emacs python shell在 emacs python shell 中重新加载更改的 python 文件
【发布时间】:2009-11-29 18:49:50
【问题描述】:

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

从我目前的阅读看来,

reload(modulename)

应该可以,但似乎不行。

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

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

【问题讨论】:

    标签: python emacs


    【解决方案1】:

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

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

    【讨论】:

    • 这条评论中重要的是,您不仅要重新加载模块,还要根据“新”模块重新实例化对象
    • 在一般情况下,仅修复导入方式不会使重新加载工作。如果您存储了导入模块中的任何内容(例如类实例),则不会重新加载它。为了使重新加载正常工作,您必须递归地重新加载其所有用户。重新加载很脆弱,我强烈建议不要在测试时使用它——调试时最不需要的事情就是被部分重新加载所困扰,这会导致在重新启动 shell 时消失的神秘错误。
    【解决方案2】:

    这似乎对我有用:

    创建一个名为 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
    

    【讨论】:

    • 感谢它现在完美运行,我一定是在做一些奇怪的事情。
    • 请注意,如果可用,重新加载将更喜欢从 .pyc 文件重新加载。因此,如果您进行了更改但 pyc 文件没有被重建或删除,您的更改将不会出现在 shell 中。
    • 在 CPython 中,如果源文件比 .pyc 文件新,reload 会自动重新读取源文件。我现在在文档中找不到这个,但试试吧——它有效。
    【解决方案3】:

    在研究了这个问题相当长的一段时间后,我得出的结论是,最好的解决方案是基于你的 python 解释器的初始化文件(例如 ipython),或者使用 python 构建-in 模块“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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-22
      • 2015-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-20
      相关资源
      最近更新 更多