问题描述
我正在尝试实现一个会生成很多场景的代码。此方案将由3个不同的模拟器执行。
def save_variables(I,T,R,C,lambd,K,iteraction):
filename='/folder/shelve_{}.out'.format(iteraction)
my_shelf = shelve.open(filename,'n')
for key in dir():
try:
my_shelf[key] = locals()[key]
except TypeError:
pass
my_shelf.close()
我正在像这样在每个模拟器中加载数据:
my_shelf = shelve.open(filename)
my_shelf = shelve.open(filename)
for key in my_shelf:
globals()[key]=my_shelf[key]
my_shelf.close()
这部分效果很好。我的问题是:
如果我在同一执行终端上同时运行所有代码,例如,首先在同一执行行中的scenario_generator,在simulator_1之后,在simulator_2之后,至少在simulator_3之后,这些代码就很好用了。>
但是,如果我仅在一个终端中运行scenario_generator,并在其他3个不同的执行终端中启动每个模拟,则会收到以下错误:
Number of arguments: 2 arguments.
Argument List: on
Iteraction 0
Traceback (most recent call last):
File "main.py",line 53,in <module>
onets.onets(i)
File "/Users/simulator_1.py",line 31,in simulator_1
n = [[0 for x in range(I+1)] for y in range(T+1)]
NameError: name 'T' is not defined
我了解到,此通知无法读取搁置保存的数据。但是文件在文件夹中。有人知道我该如何解决这个问题?
P.S .:对我来说,以这种方式(单独执行)很重要,因为我应该在不同的执行终端中同时启动3个模拟器。这将大大节省执行时间,使我得到结果。
谢谢大家。
解决方法
不确定,我怀疑您没有存储所有您认为已搁置的变量。
当这些步骤在一个脚本中一起使用时,如果未将某些值写在架子上,您将不会注意到,因为您明确地使TypeError`异常静默了。
由于不易发现错误,因此不建议这样做。您可能完全是为了避免发生某些错误。
因为这些脚本位于同一文件中,所以它们共享相同的全局范围。 当您将这些值重新读回全局范围,并且缺少某些值时,该相同全局范围中的原始值可能会覆盖您。
所以您会错过一些值,但是当您需要它们时,它们已经存在于全局范围中可供读取。
有了单独的文件,就不再有一个通用的全局范围。任何缺少的值都将导致错误。
删除pass
,并使except
子句打印当前键和值,以检查丢失的键。
除此之外,我认为生成文件数据以稍后从您描述的任何不同进程/脚本中读取都没有问题(假设没有缓存/同步问题,并且您打开文件仅供读取)