python刷新/重新加载

wom*_*ble 27 python refresh reload

这是一个非常基本的问题 - 但我无法通过在线搜索找到答案.

我使用python来控制ArcGIS,我有一个简单的python脚本,它调用一些预先编写的代码.

但是,当我对预先编写的代码进行更改时,它似乎不会导致任何更改.我导入了这个模块,并尝试刷新它,但没有任何反应.

我甚至将它调用的文件移动到另一个位置,脚本仍然可以正常工作.我昨天做的一件事是我添加了所有我的python文件到sys路径的文件夹(使用sys.append('path')),我想知道这是否有所作为.

在此先感谢,并抱歉草率的术语.

Len*_*bro 32

目前还不清楚你对"刷新"的意思,但Python的正常行为是你需要重新启动软件才能在Python模块上焕然一新并重新阅读它.

如果您的更改即使在重新启动后仍未处理,则这是由于以下两个错误之一:

  1. pyc文件的时间戳不正确,将来有一段时间.
  2. 您实际上是在编辑错误的文件.

即使不使用reload()命令重新启动软件,也可以通过重新加载重新读取文件.请注意,指向模块中任何内容的任何变量都需要在重新加载后重新导入.像这样的东西:

import themodule
from themodule import AClass

reload(themodule)
from themodule import AClass
Run Code Online (Sandbox Code Playgroud)


Mar*_*off 19

一种方法是打电话reload.

示例:以下是以下内容foo.py:

def bar():
    return 1
Run Code Online (Sandbox Code Playgroud)

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

>>> import foo
>>> foo.bar()
1
Run Code Online (Sandbox Code Playgroud)

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

def bar():
    return "Hello"
Run Code Online (Sandbox Code Playgroud)

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

>>> reload(foo)
<module 'foo' from 'foo.py'>
>>> foo.bar()
'Hello'
Run Code Online (Sandbox Code Playgroud)

调用reload是确保模块即使磁盘上的文件发生更改也是最新的一种方法.这并不一定是最有效的(你可能会更好检查该文件的最后修改时间或使用类似pyinotify中你之前reload),但它肯定是快速实施.

Python每次都不从源模块读取的一个原因是加载模块是(相对)昂贵的 - 如果你有一个300kb模块并且你只是使用文件中的一个常量怎么办?Python加载一次模块并将其保存在内存中,直到你reload.