如何使 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 模块?的主要内容,如果未能解决你的问题,请参考以下文章
自动热重启和重新加载停止发生 - Flutter/VS Code
如何使 webpack typescript 响应 webpack-dev-server 配置以自动构建和重新加载页面