【问题标题】:Jupyter does not see changes in the imported moduleJupyter 看不到导入模块的变化
【发布时间】:2021-01-17 08:49:40
【问题描述】:

我有一个名为“Notebook.ipynb”的文件。我想将我自己的模块导入它的patterns.py。假设在 patterns.py 我有一个变量a=1。如果我在导入之后在 Jupyter 中打印它,我希望得到 1。但是如果我将变量的值更改为 patterns.py,Jupyter 会继续认为变量 a 等于 1。同时,当然,我重新启动了从patterns.py导入变量的单元格

我需要做什么才能让 Jupyter 明白变量的值已经改变了?

【问题讨论】:

    标签: python-3.x jupyter-notebook


    【解决方案1】:

    这件事发生在我身上。

    您需要重新启动 python 内核,以便 jupyter 可以读取位于工作目录中的 python 脚本的新状态。

    那么变量a 应该打印新的赋值。

    【讨论】:

    • 每次更改时都需要这样做吗?
    • 不幸的是。
    【解决方案2】:

    假设我们在folder_name/filename.py 有一个文件并在一些.ipynb 中调用它

    def some_func():
        print("test")
    

    是这样修改的

    def some_func():
        print("test2")
    

    在这种情况下,第二次调用 .ipynb 中的以下代码

    import folder_name.filename as module_name
    module_name.some_func()
    

    返回test

    要更新功能,需要重新加载模块:

    importlib.reload(module_name)
    # you can reload "folder_name.filename" if you do not use molude name alias
    module_name.some_func()
    

    此代码将返回test2
    在运行reload之前不要忘记import importlib

    【讨论】:

      【解决方案3】:

      实际上有一个漂亮的 IPython 扩展名为 autoreloadThis answer 展示了如何在 IPython shell 中使用它,但您可以在 Jupyter 笔记本中执行相同操作。只需添加:

      %load_ext autoreload
      %autoreload 2
      

      在您导入要跟踪其更改的模块之前,它将在您执行每个单元之前重新导入。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-18
        • 1970-01-01
        • 1970-01-01
        • 2020-02-21
        • 1970-01-01
        • 1970-01-01
        • 2013-11-07
        相关资源
        最近更新 更多