在解释器中重新加载(更新)模块文件

时间:2010-09-19 22:10:08

标签: python module

假设我有这个python脚本script.py并通过输入

将其加载到解释器中
import script

然后输入以下命令执行我的功能:

script.testFunction(testArgument)

确定到目前为止这么好,但是当我更改script.py时,如果我再次尝试导入,则脚本不会更新。我必须退出解释器,重新启动解释器,然后导入新版本的脚本才能工作。

我该怎么办?

3 个答案:

答案 0 :(得分:11)

您可以发出reload script,但这不会更新现有对象,也不会深入其他模块。

幸运的是,这是由IPython解决的 - 一个支持自动重新加载的更好的python shell。

要在IPython中使用自动加载功能,您必须先输入import ipy_autoreload,或将其永久保存在~/.ipython/ipy_user_conf.py

然后运行:

%autoreload 1
%aimport script

%autoreload 1表示在从提示符执行代码之前,将重新加载每个加载%aimport的模块。但是,这将更新任何现有对象。

请参阅http://ipython.org/ipython-doc/dev/config/extensions/autoreload.html了解更多有趣的事情。

答案 1 :(得分:7)

http://docs.python.org/library/functions.html#reload

  

重载(模块)的

     

重新加载以前导入的模块。论证必须   是一个模块对象,所以它必须先成功导入。   如果您使用a编辑了模块源文件,这将非常有用   外部编辑器,并希望不离开地试用新版本   Python解释器。返回值是模块对象(   与模块参数相同。)

答案 2 :(得分:1)

另一个对我有帮助的解决方案是维护sys.modules密钥的副本并在导入后弹出新模块以强制重新导入深层导入:

>>> oldmods = set(sys.modules.keys())
>>> import script
>>> # Do stuff
>>> for mod in set(sys.modules.keys()).difference(oldmods): sys.modules.pop(mod)
>>> import script