Python重新加载文件
Posted
技术标签:
【中文标题】Python重新加载文件【英文标题】:Python reload file 【发布时间】:2015-10-03 07:32:25 【问题描述】:我有一个计算一些东西的脚本。它使用来自单独文件“inputs.py”的输入。
'inputs.py' 中只有几个变量:
A = 2.3
B = 4.5
C = 3.0
在主文件中,我将它们导入
from inputs import *
如果我现在更改 'inputs.py' 中的某些内容并再次执行脚本,它仍然使用旧值而不是新值。如何重新加载文件?
reload(inputs)
不工作。
非常感谢!
【问题讨论】:
你在用python 3吗? 如果在 Python3 上使用importlib.reload
我使用的是 ipython 2.4.1
how to "reimport" module to python then code be changed after import的可能重复
【参考方案1】:
如果您使用的是 Python 3.x ,那么要重新加载使用 from module import name
导入的名称,您需要这样做 -
import importlib
import inputs #import the module here, so that it can be reloaded.
importlib.reload(inputs)
from inputs import A # or whatever name you want.
对于 Python 2.x,你可以简单地做 -
import inputs #import the module here, so that it can be reloaded.
reload(inputs)
from inputs import A # or whatever name you want.
【讨论】:
第4行是多余的,你可以简单的做:inputs = importlib.reload(inputs)【参考方案2】:from inputs import *
做类似这样的伪代码:
import inputs as temporary
for all names in temporary:
(name) = temporary.name
del temporary
模块inputs
缓存在sys.modules
中。
如果你执行reload(inputs)
,缓存的模块会被重新加载,但不会重复将数据从导入的模块加载到本地名称空间的分配过程。正如其他答案所述,您必须手动完成。
【讨论】:
【参考方案3】:让我们引用文档:
重新加载(模块)
重新加载以前导入的模块。参数必须是模块对象,所以它必须之前已经成功导入。这是 如果您使用外部编辑了模块源文件,则很有用 编辑器,想在不离开 Python 的情况下试用新版本 口译员。返回值是模块对象(同 模块参数)。
参数必须是一个模块对象,所以它之前一定是成功导入的。当你做from inputs import *
你实际上在你的命名空间中没有模块对象。仅限模块成员。
reload(module) 执行时:
重新编译 Python 模块的代码并重新执行模块级代码,定义一组新的对象,这些对象绑定到 模块的字典。扩展模块的init函数不是 第二次调用。 与 Python 中的所有其他对象一样,旧对象仅在其引用计数降至零后才会被回收。 模块命名空间中的名称已更新,以指向任何新的或更改的对象。 对旧对象的其他引用(例如模块外部的名称)不会重新绑定以引用新对象,必须 如果需要,在它们出现的每个命名空间中更新。
对旧对象的其他引用(例如模块外部的名称)不会重新绑定以引用新对象,如果需要,必须在它们出现的每个命名空间中更新。您明星导入的 A、B 和 C 正是其他参考。
总而言之,示例代码如下:
import os # see below
# fake module before changes
with open('inputs.py', 'w') as f:
f.write("a, b, c = 1, 2, 3")
import inputs
# check if all members are correct
assert inputs.a == 1
assert inputs.b == 2
assert inputs.c == 3
os.unlink('inputs.pyc') # Remove previously compiled byte-code.
# I'm now sure if it's mandatory, anyway for some reason Python
# does not recompile inputs.py in my experiments.
# New fake file
with open('inputs.py', 'w') as f:
f.write("a, b, c = 4, 5, 6")
reload(inputs)
# check if members has changes
assert inputs.a == 4
assert inputs.b == 5
assert inputs.c == 6
【讨论】:
以上是关于Python重新加载文件的主要内容,如果未能解决你的问题,请参考以下文章