Python重装文件

Seb*_*ian 7 python file reload

我有一个计算一些东西的脚本.它使用来自单独文件'inputs.py'的输入.

在'inputs.py'中只有几个变量:

A = 2.3
B = 4.5
C = 3.0
Run Code Online (Sandbox Code Playgroud)

在主文件中我导入它们

from inputs import *
Run Code Online (Sandbox Code Playgroud)

如果我现在在'inputs.py'中更改某些内容并再次执行该脚本,它仍然使用旧值而不是新值.我怎样才能重新加载文件?

reload(inputs)
Run Code Online (Sandbox Code Playgroud)

不起作用.

提前谢谢了!

Ana*_*mar 13

如果您使用的是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.
Run Code Online (Sandbox Code Playgroud)

对于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.
Run Code Online (Sandbox Code Playgroud)


Łuk*_*ski 5

让我们引用文档:

重新加载(模块)

重新加载先前导入的模块。参数必须是模块对象,因此它必须已经成功导入。如果您已使用外部编辑器编辑了模块源文件,并且想在不离开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
Run Code Online (Sandbox Code Playgroud)