Python 使用shelve保存和加载变量
我正在尝试实现一个代码,它将生成许多场景。该场景将在3个不同的模拟器之后执行 我正在使用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():
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这是不可能的,因为在启动模拟器之前,我已经完成了第一步(场景生成)。所有场景都已生成。