【问题标题】:Need to restart python in Terminal every time a change is made to script每次对脚本进行更改时都需要在终端中重新启动 python
【发布时间】:2010-07-30 18:59:31
【问题描述】:

每次我对 python 脚本进行更改时,我都必须重新加载 python 并重新导入模块。请告知我如何修改我的脚本并运行,而无需在终端中重新启动 python。

谢谢。

【问题讨论】:

  • 是的!至少python有一个重新加载。 PHP 只是因为“无法重新声明函数”等等而吓坏了。

标签: python


【解决方案1】:

根据您描述工作流程的评论,我有一个建议:

首先,我在终端中运行 python3.1 第二个,我执行“导入模块”然后,我从模块中运行一个方法,每次都说“module.method(arg)”,我尝试调试代码,我即使更改很小,也必须执行整个序列。效率极低

不要启动交互式 Python shell,而是让模块本身可执行。最简单的方法是在模块底部添加一个块,如下所示:

if __name__ == '__main__':
    method(arg) # matches what you run manually in the Python shell

然后,您可以执行以下操作,而不是运行 python3.1,然后导入模块,然后调用方法:

python3.1 modulename.py

Python 将运行if __name__ == '__main__' 块中的任何代码。但是,如果该模块是由另一个 Python 模块导入的,则该代码将不会运行。有关这个常见 Python 习语的更多信息,请访问in the Python tutorial

这样做的好处是,当您对代码进行更改时,通常只需按向上箭头并回车即可重新运行模块。无需繁琐的重新加载。

【讨论】:

    【解决方案2】:

    如果只是某个模块发生了变化,您可以在脚本中调用reload(module)

    【讨论】:

    • 这是正确的,但请注意,如果您点击链接,您会看到一些警告。
    【解决方案3】:

    您的意思是直接在交互式 python 中输入脚本,还是通过运行 python myscript.py 之类的东西从终端执行 .py 文件?

    【讨论】:

    • 首先,我在终端中运行 python3.1,然后我执行“导入模块”,然后,我从模块中运行一个方法,每次都说“module.method(arg)”,我尝试调试代码,我必须完成整个序列,即使更改很小。效率极低
    • 更新: 我看到 Will McCutchen 打败了我。您要做的是将脚本写入文件而不是在终端中执行。比如说,您的文件名为“myscript.py”。将所有命令写入其中,然后只需将python3.1 myscript.py 放在与您的脚本相同的文件夹中,它将运行。这样您就不必每次都输入命令。你在运行什么操作系统,windows?
    【解决方案4】:

    我在网上找到了一个旁路。存在魔术命令。它对我来说就像一个魅力。重新加载选项对我不起作用。从here 和此链接的第 3 点得到它。

    基本上,您只需执行以下操作:您所做的更改会在您保存后自动反映出来。

    In [1]: %load_ext autoreload
    
    In [2]: %autoreload 2
    
    In [3]: Import MODULE
    
    In [4]: my_class = Module.class()
            my_class.printham()
    Out[4]: ham
    
    In [5]: #make changes to printham and save
    In [6]: my_class.printham() 
    Out[6]: hamlet
    

    【讨论】:

      【解决方案5】:

      您可以使用reload 重新导入模块。我在使用交互模式调试代码时经常使用它。

      但是,从更高的层次来看,我会犹豫在程序的生产版本中使用它。除非您对子模块的更改方式有非常严格的控制,否则重新加载的模块以某种方式更改会破坏您的程序并不难。除非您的程序确实需要 100% 的正常运行时间,否则在发生某种版本更改时停止它并重新启动它是有意义的。

      【讨论】:

      • 对于 Python 3,重新加载已移至 imp,因此您必须先移至 import imp,然后再移至 imp.reload(mod)
      最近更新 更多