当我在iPython中(使用%run
重新运行Python 3脚本时,当(a)有一个模块要重新加载并且(b)在该模块中时,我遇到了难以描述的问题,有一些随机数字生成的变量。
作为一个示例,我试图理解和解决这个问题,例如,我有两个python文件,一个叫做test.py
,另一个叫做other.py
。
以下是test.py
的内容:
import importlib
import numpy.random as rng
seed = 123
myRngEngine = rng.RandomState(seed)
import other
importlib.reload(other)
from other import *
print(var)
以下是other.py
的内容:
from __main__ import *
var = myRngEngine.randint(0, 1000, 1)[0]
现在,我打开一个iPython控制台,然后输入:
%run /mypath/test.py
我作为输出打印的数字是365
。如果重复上述操作以重新运行脚本,则将得到510
作为输出。从那时起,如果我重复一遍,我总是得到510
。现在,我关闭iPython控制台,然后启动iPython控制台的新实例。再次,当我第一次进入上面的%run
行时,我得到365
作为输出,但是在所有后续尝试中,我都得到了510
。
问题:
(1)为什么会这样?
(2)如何解决这个问题,因为种子设置为相同,因此所有尝试都将导致完全相同的输出?
一个重要的细节是为什么我在test.py
中执行以下操作:
import other
importlib.reload(other)
from other import *
我真的需要这样的灵活性:每当我运行test.py
时,都应该反映出我对other.py
所做的任何更改,而不必重新启动iPython。
另一个重要的细节是为什么我要为other.py
中的“全局”变量赋值,例如var
。正是因为文件other.py
可以作为config / global-variables文件工作-因此目前有此必要。