【发布时间】:2021-06-26 20:42:43
【问题描述】:
假设我有文件foo.py:
def foo():
print("foo")
然后我开始一个交互式会话:
>>> import foo
>>> foo.foo()
'foo'
接下来,我在python文件中添加一个函数:
def bar():
print("bar")
我更新了我的交互式会话:
>>> import foo
>>> foo.bar()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'bar' is not defined
所以我意识到我忘记了导入是缓存的:
>>> from importlib import reload
>>> reload(foo)
>>> foo.bar()
'bar'
有没有一种简单的方法可以让交互式会话随着 foo.py 中累积的任何更改不断更新?
为了清楚起见,我必须添加这个,因为这个问题可能会被多种方式误解:
这个问题的具体目的是能够在交互模式下完全按照交互模式的工作方式工作,并且能够在写入后调用在另一个窗口、缓冲区或上下文中动态写入的函数驱动器,没有进入重新加载。
换句话说,我希望每次在缓冲区之间来回弹出时都消除不必要的击键(例如,CTRL-R 重新加载 ENTER)。
有没有简单的方法?
(如果答案是“否”就可以了)
可能会创建解决方案但并不“简单”的解决方案:
- 一堆代码
- 解释器循环中的解释器
- 一个应用程序
- 一种新颖的口译工作
- 一个新的ide公司
一个类似的简单方法的例子:
pip install --editable my-dev-module
【问题讨论】:
-
这能回答你的问题吗? How do I unload (reload) a Python module?
-
这似乎属于重复问题(stackoverflow.com/questions/437589/…)
-
@JuanMedina 不,这与我的问题无关
-
@JuanMedina 它不起作用。这个问题的重点是删除交互模式下的
reload仪式。不要“在while循环中做某事” -
这可能是不可能的,因为 python 的
import工作方式 - 它搜索命名模块,然后将搜索结果绑定到本地范围内的名称。此绑定不会跟踪原始模块以检测更改,因此除非您编写解释器或执行该操作的 REPL(您不希望这样做),否则重新加载是唯一的方法。
标签: python-3.x reload python-importlib