【问题标题】:IPython notebook: how to reload all modules in a specific Python file?IPython 笔记本:如何重新加载特定 Python 文件中的所有模块?
【发布时间】:2016-02-25 01:12:30
【问题描述】:

我在一个文件中定义了许多模块,并将from myFile import * 添加到我的 ipython notebook 的第一行,以便我可以将它用作此 notebook 中其他部分的依赖项。

目前我的工作流程是:

  1. 修改myFile
  2. 重启 Ipython 内核
  3. 重新运行 Ipython 中的所有代码。

有谁知道是否有办法重新加载myFile 中的所有模块而无需重新启动 Ipython 内核?谢谢!

【问题讨论】:

    标签: python ipython ipython-notebook


    【解决方案1】:

    来自 ipython 文档:

    In [1]: %load_ext autoreload
    
    In [2]: %autoreload 2
    
    In [3]: from foo import some_function
    
    In [4]: some_function()
    Out[4]: 42
    
    In [5]: # open foo.py in an editor and change some_function to return 43
    
    In [6]: some_function()
    Out[6]: 43
    

    您还可以通过执行以下操作将自动重新加载配置为自动发生: ipython profile create

    并将以下内容添加到~/.config/ipython/profile_default/ipython_config.py

    c.InteractiveShellApp.extensions = ['autoreload']
    c.InteractiveShellApp.exec_lines = ['%autoreload 2']
    c.InteractiveShellApp.exec_lines.append('print("Warning: disable autoreload in ipython_config.py to improve performance.")')
    

    注意:如果重命名函数,则需要重新运行import 语句

    【讨论】:

    【解决方案2】:

    使用 importlib!

    import importlib
    importlib.reload(my_awesome_python_script)
    

    因此,当您在后端更改 my_awesome_python_script 时,无需重新启动内核或重新运行整个笔记本。只需重新运行此单元格。 如果您在内存繁重的数据集上做了很多工作,这将非常有用

    【讨论】:

      【解决方案3】:

      您应该在重新启动并通过运行所有单元格再次打开笔记本后开始您的工作流程。在顶部菜单中,在执行任何其他操作之前,首先选择“Cell->Run all”

      【讨论】:

      • 但这也需要重启 IPython 内核,对吧?
      • @WeiChen 不,你不必重启iPython内核,你可以随时“Cell->Run all”。
      • 但这不起作用,因为 Ipython 笔记本不会通过运行“全部运行”来导入最新版本的 myFile,而是假定它已经被导入并跳过该单元格。
      • 不知道为什么这被否决了,但这是一个合理的答案,对我有用,
      • @JakeWagner 是的,有时我不确定为什么人们这么快就否决了答案。无论如何,感谢您的投票!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-20
      • 2014-09-11
      相关资源
      最近更新 更多