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重新加载文件的主要内容,如果未能解决你的问题,请参考以下文章

每小时使用批处理文件重新加载 python 脚本

在python中重新加载模块

如何在烧瓶中重新加载python模块?

Python 重新加载模块

Python C API - 重新加载模块

python保存大列表(list)数据到文件并后续重新加载为列表(list)对象实战