Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用shelve保存和加载变量_Python_Variables_Shelve - Fatal编程技术网

Python 使用shelve保存和加载变量

Python 使用shelve保存和加载变量,python,variables,shelve,Python,Variables,Shelve,我正在尝试实现一个代码,它将生成许多场景。该场景将在3个不同的模拟器之后执行 我正在使用shelve将我的场景保存在一个文件中。我的代码如下: 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():

我正在尝试实现一个代码,它将生成许多场景。该场景将在3个不同的模拟器之后执行

我正在使用shelve将我的场景保存在一个文件中。我的代码如下:

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()
我在每个模拟器中加载数据,如下所示:

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()
这部分很好用。我的问题是:

如果我在同一个执行终端一起运行所有代码,例如,在同一执行行中,首先运行场景生成器,在模拟器1之后,在模拟器2之后,至少在模拟器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
参数数量:2个参数。
参数列表:打开
Iteraction 0
回溯(最近一次呼叫最后一次):
文件“main.py”,第53行,在
一个,一个(一)
文件“/Users/simulator_1.py”,第31行,在simulator_1中
n=[[0代表范围(I+1)中的x]代表范围(T+1)中的y]
NameError:未定义名称“T”
我理解此通知无法读取由shelved保存的数据。但文件在文件夹中。有人知道我如何解决这个问题吗

注意:以这种方式(单独)执行对我来说很重要,因为我应该在不同的执行终端同时启动3模拟器。这将大大节省我的执行时间


谢谢大家。

不确定的是,我怀疑您没有存储所有您认为在搁置中的变量

当这些步骤集中在一个脚本中时,如果某些值没有写入搁置中,您将不会注意到,因为您明确地使TypeError`异常静音

不建议这样做,因为错误会被忽略。你这样做可能是为了避免发生一些错误

因为脚本在同一个文件中,所以它们共享相同的全局范围。 当您将这些值读回全局范围,而某些值丢失时,您可能会被该全局范围中的原始值覆盖

所以您遗漏了一些值,但当您需要它们时,它们已经存在于全局范围中,可以从中读取

对于单独的文件,不再有通用的全局作用域。任何缺少的值都将导致错误

删除
pass
并使
except
子句打印当前键和值,以检查是否缺少键


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

是否可能场景计算速度较慢,并且一些模拟尝试读取一个尚未存在的密钥,因为场景尚未关闭该文件?(因此不能保证文件是同步的)。然后在每次写入之后尝试“.sync()。@progmatico这是不可能的,因为在启动模拟器之前,我已经完成了第一步(场景生成)。所有场景都已生成。