【问题标题】:Python reload filePython重新加载文件
【发布时间】: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 file reload


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2020-03-08
      • 1970-01-01
      • 1970-01-01
      • 2012-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-03
      • 1970-01-01
      相关资源
      最近更新 更多