使用货架保存和加载变量

问题描述

我正在尝试实现一个生成很多场景的代码。此方案将由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子句打印当前键和值,以检查丢失的键。

除此之外,我认为生成文件数据以稍后从您描述的任何不同进程/脚本中读取都没有问题(假设没有缓存/同步问题,并且您打开文件仅供读取)