python 刷新/重载
这是一个非常基础的问题,但我在网上搜索时没有找到答案。
我正在用Python来控制ArcGIS,并且我有一个简单的Python脚本,它调用了一些预先写好的代码。
但是,当我对这些预先写好的代码进行修改时,似乎没有任何变化。我导入了这个模块,也尝试过刷新它,但什么都没有发生。
我甚至把它调用的文件移动到了另一个地方,脚本仍然可以正常工作。昨天我做的一件事是把我所有Python文件所在的文件夹添加到了系统路径中(使用sys.append('path')),我在想这是否会有影响。
提前谢谢你们,抱歉用词不太准确。
7 个回答
如果你在使用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
一种方法是使用 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
。
你说的“刷新”是什么意思不太清楚,但在Python中,正常的情况是你需要重启软件,才能让它重新查看一个Python模块并重新读取它。
如果你重启后还是没有看到你的修改,那可能是以下两个问题之一:
- pyc文件的时间戳不正确,显示的时间在未来。
- 你其实是在编辑错误的文件。
你可以使用reload()命令在不重启软件的情况下重新读取一个文件。需要注意的是,任何指向模块中内容的变量在重新加载后都需要重新导入。像这样:
import themodule
from themodule import AClass
reload(themodule)
from themodule import AClass