如何使 VSCode 自动重新加载外部 *.py 模块?

Posted

技术标签:

【中文标题】如何使 VSCode 自动重新加载外部 *.py 模块?【英文标题】:How to make VSCode auto-reload external *.py modules? 【发布时间】:2019-09-27 07:17:08 【问题描述】:

我正在编写 Visual Studio Code 中的 python 代码,并为函数使用了几个文件,我在脚本的开头导入了这些文件。假设我在与我的主脚本相同的文件夹中有一个文件“doStuff.py”,其内容

def doStuff():
    print('I am doing stuff!')
    # print('lots of stuff.')

然后我会在另一个脚本中导入,例如“main.py”写成

from doStuff import doStuff
doStuff()

如果我现在运行脚本,然后运行例如取消注释 doStuff.py 中函数的第二行,我希望看到我的 doStuff() 方法的新行为。不幸的是,这不会发生。我最近从 Spyder 切换到 VSCode,在 Spyder 中这总是自动工作,但似乎 VSCode 不会自动重新加载导入的模块。

关于我当前工作流程的一些信息: 要打开编程环境,我使用“文件/打开文件夹”并选择 main.py 和 doStuff.py 所在的文件夹。 然后我使用“在 Python 交互窗口中运行当前文件”来启动我的脚本。 我猜有更好的方法,它可能与 launch.json 文件有关,但到目前为止,我发现让它使用更改后的外部符号的唯一方法是重新启动 VSCode。

编辑: 这里的问题:Visual Studio Code: Auto-refresh file changes 是不同的,如果我理解正确的话,因为它是关于要在 VS-Code 中重新加载的外部更改文件。我的问题与在交互式窗口中重新加载 python 模块有关。

编辑 2:

【问题讨论】:

Visual Studio Code: Auto-refresh file changes的可能重复 @PeterWood 您发布的问题与 VSCode 之外的文件更改有关,不是吗?我正在更改 VSCode 中的文件,但它们仍然没有被重新加载。 你必须再次运行脚本。 @PeterWood 很明显,是的。但在给定的例子中。这只会打印第一条消息而不是第二条消息。在我重新启动 VSCode 之前,它的行为就像我没有更改 doStuff.py 一样。 重启 Python 内核也可以。这样做仍然不令人满意,但比重新启动 VSCode 更好。 【参考方案1】:

更新: 终极解决方案。 只需将其添加到您的代码中即可。

%reload_ext autoreload
%autoreload 2

=========================================== 当 .py 文件更改时,我找不到使 vscode 自动重新刷新的 python 交互方式。但我尝试importlib.reload(),它以某种方式起作用。

import funcs
import importlib
importlib.reload(funcs)
from funcs import *

funcs 是我的 .py 文件,上面的代码应该在文件更改时运行。

【讨论】:

谢谢,这实际上回答了这个问题。似乎有必要将 py 文件作为模块导入才能重新加载它。添加代码import myPyFile; import importlib; importlib.reload(myPyFile); from myPyFile import MyClass 可以重新加载单个类,正如我在原始问题中想要的那样。对我来说还是有点乏味.. 嗨,我找到了终极解决方案!在上面看到我的更新。 非常好,我有一个附加组件:我们可以将这些行添加到设置"python.dataScience.runMagicCommands" 中。这样我们就不需要将这些行包含到所有脚本中。这正是我一直在寻找的。非常感谢! 它的工作原理是这样的:"python.dataScience.runMagicCommands": "%reload_ext autoreload\n%autoreload 2" runMagicCommands 已弃用。您可以使用:"python.dataScience.runStartupCommands": "%load_ext autoreload\\n%autoreload 2"【参考方案2】:

现在可以通过添加set up autoreload automatically:

    "jupyter.runStartupCommands": [
        "%load_ext autoreload", "%autoreload 2"
    ]

settings.json

【讨论】:

配置已经根据这个***.com/questions/65356299/…"jupyter.runStartupCommands"是新的了【参考方案3】:

我会评论 leo 的回答,但我没有足够的声誉。 VSCode 中的 leo 的 sn-p 显示设置未知。这对我有用:

"jupyter.runStartupCommands": [
    "%load_ext autoreload", "%autoreload 2"
],

【讨论】:

【参考方案4】:

这实际上与 VS Code 的 Python 扩展无关,而是您正在使用的 REPL 及其提供的内容(我假设它是终端中的 REPL,但您没有指定它是那个还是交互式窗口)。

无论如何,我真的觉得 Spyder 会自动重新加载有点令人担忧,因为它有很多与之相关的“陷阱”情况(作为 Python 中导入的实现者,我亲身知道重新加载模块只能工作在某些情况下,您上面建议的情况属于由于您的from doStuff import doStuff 以可靠的方式调用而没有得到您期望的类别,而没有一些我不想依赖工作的神奇黑客)。

【讨论】:

感谢您的回答。指定:我没有使用 REPL 控制台,而是基于 Jupyter 服务器的交互式窗口。 在 Spyder 中,我的工作流程基于 iPython 控制台,我不得不说它的行为正是我希望在 VS Code 中拥有的。你会如何建议重新导入模块呢?对我来说,处理多个 .py 文件只是一个组织问题,我主要使用自己编写的类,这些类在工作时会不断更改。有没有办法在不重新启动 vs Code 的情况下重新加载我的外部代码?另外,您能否进一步说明为什么您认为 Spyder 令人担忧?对我来说,这似乎是理想的行为。 @Richard 要重新加载,您可以使用importlib.reload() 手动尝试。至于为什么令人担忧,这是一个关于导入和对象引用如何在 Python 中工作的技术方面的长期讨论。如果你特别想要这个功能,那么请在github.com/microsoft/vscode-python 上打开一个问题。

以上是关于如何使 VSCode 自动重新加载外部 *.py 模块?的主要内容,如果未能解决你的问题,请参考以下文章

文件更改时如何自动重新加载Django?

自动热重启和重新加载停止发生 - Flutter/VS Code

如何使 webpack typescript 响应 webpack-dev-server 配置以自动构建和重新加载页面

在 Python 中,如何在重新加载后更改实例化对象?

python importlib,如何使动态加载文件的缓存无效

在 Docker 上自动重新加载烧瓶服务器