python 刷新/重载

29 投票
7 回答
116289 浏览
提问于 2025-04-15 14:47

这是一个非常基础的问题,但我在网上搜索时没有找到答案。

我正在用Python来控制ArcGIS,并且我有一个简单的Python脚本,它调用了一些预先写好的代码。

但是,当我对这些预先写好的代码进行修改时,似乎没有任何变化。我导入了这个模块,也尝试过刷新它,但什么都没有发生。

我甚至把它调用的文件移动到了另一个地方,脚本仍然可以正常工作。昨天我做的一件事是把我所有Python文件所在的文件夹添加到了系统路径中(使用sys.append('path')),我在想这是否会有影响。

提前谢谢你们,抱歉用词不太准确。

7 个回答

4

如果你在使用IPython这个环境,那么有一些特别的命令可以用。

IPython的文档里介绍了一个叫做自动重载扩展的功能。

最开始,我是从Jonathan March的博客上找到这个解决方案的(可以查看那个链接的第3点)。

基本上,你只需要做以下几步,保存后你所做的更改会自动更新:

In [1]: %load_ext autoreload

In [2]: %autoreload 2

In [3]: Import MODULE

In [4]: my_class = Module.class()
        my_class.printham()
Out[4]: ham

In [5]: #make changes to printham and save
In [6]: my_class.printham() 
Out[6]: hamlet
20

一种方法是使用 reload 这个命令。

举个例子:这里是 foo.py 的内容:

def bar():
    return 1

在一个交互式会话中,我可以这样做:

>>> import foo
>>> foo.bar()
1

然后在另一个窗口中,我可以把 foo.py 改成:

def bar():
    return "Hello"

回到交互式会话中,调用 foo.bar() 仍然会返回 1,直到我执行:

>>> reload(foo)
<module 'foo' from 'foo.py'>
>>> foo.bar()
'Hello'

调用 reload 是确保你的模块是最新的一种方法,即使磁盘上的文件已经改变。虽然这不一定是最有效的做法(你可能更好地检查一下文件的最后修改时间,或者在 reload 之前使用像 pyinotify 这样的工具),但它确实很快就能实现。

Python 不每次都从源模块读取的一个原因是,加载一个模块是相对耗费资源的——假设你有一个 300kb 的模块,而你只用到了文件中的一个常量,那就很浪费了。Python 只会加载一次模块,并把它保存在内存中,直到你执行 reload

35

你说的“刷新”是什么意思不太清楚,但在Python中,正常的情况是你需要重启软件,才能让它重新查看一个Python模块并重新读取它。

如果你重启后还是没有看到你的修改,那可能是以下两个问题之一:

  1. pyc文件的时间戳不正确,显示的时间在未来。
  2. 你其实是在编辑错误的文件。

你可以使用reload()命令在不重启软件的情况下重新读取一个文件。需要注意的是,任何指向模块中内容的变量在重新加载后都需要重新导入。像这样:

import themodule
from themodule import AClass

reload(themodule)
from themodule import AClass

撰写回答