有没有办法以交互模式连续获取 python 文件?

Posted

技术标签:

【中文标题】有没有办法以交互模式连续获取 python 文件?【英文标题】:Is there a way to continuously source a python file in interactive mode? 【发布时间】: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? 这似乎属于重复问题(***.com/questions/437589/…) @JuanMedina 不,这与我的问题无关 @JuanMedina 它不起作用。这个问题的重点是删除交互模式下的reload仪式。不要“在while循环中做某事” 这可能是不可能的,因为 python 的 import 工作方式 - 它搜索命名模块,然后将搜索结果绑定到本地范围内的名称。此绑定不会跟踪原始模块以检测更改,因此除非您编写解释器或执行该操作的 REPL(您不希望这样做),否则重新加载是唯一的方法。 【参考方案1】:

根据您的 cmets,您已澄清您不需要使用重新加载。虽然,我会列出我找到的所有可能的选项。对于 Pythn,你只有 2 个选项:

使用reload(foo)(我知道这不是你想要的方式,但存在)

使用importlib.reload(foo)

import importlib
importlib.reload(foo)

这是您仅有的两个选项。现在,如果您使用的是 IPython,您还有 2 个选择:

使用%run:%run foo.py 使用%autoreload:您要查找的选项是%aimport foo

完整解释:https://switowski.com/blog/ipython-autoreload

如果这不能回答您的问题,简单的做法是:如果不使用前 2 个选项,则不可能这样做

【讨论】:

前两个选项是同一个选项 最后的选择不是解释器 @Chris 据我所知,唯一的方法是编写自定义代码并在文件更改时通过侦听自动重新加载 @KetZoomer 是正确的。您可以尝试在第二个线程中每隔几分钟检查一次文件的 Sha256,如果不同,请重新加载模块,但这就是您真正能做的。 监听文件变化的模块:pypi.org/project/watchdog

以上是关于有没有办法以交互模式连续获取 python 文件?的主要内容,如果未能解决你的问题,请参考以下文章

交互模式下PYTHON自动补全和VIM中PYTHON自动补全

Python/Matplotlib - 有没有办法制作一个不连续的轴?

使用 Eclipse 与 GitHub 交互以获取不受支持的语言

有没有办法在 python 中找到 *.csv 存在?

有没有办法获取使用 python 创建文件的年份? [复制]

有没有办法以非交互方式压缩大量提交?