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)
让我们引用文档:
重新加载(模块)
重新加载先前导入的模块。参数必须是模块对象,因此它必须已经成功导入。如果您已使用外部编辑器编辑了模块源文件,并且想在不离开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)
| 归档时间: |
|
| 查看次数: |
10353 次 |
| 最近记录: |