Сохранение и загрузка переменных с помощью полки

Я пытаюсь реализовать код, который будет генерировать множество сценариев. Эти сценарии будут выполняться после трех разных симуляторов.

Я сохраняю свои сценарии в файл, используя полку. Мой код такой:

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, в одной строке исполнения коды прекрасно работают.

Но если я запускаю только генератор сценария в одном терминале и запускаю каждую симуляцию в других 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 симулятора в одно и то же время, в разных терминалах исполнения. Это обеспечит большую экономию времени выполнения, чтобы получить мои результаты.

Спасибо всем.


person Henrique Lima    schedule 03.11.2020    source источник
comment
Возможно ли, что расчет сценария идет медленно, и некоторая симуляция пытается прочитать ключ, которого еще нет, потому что сценарий еще не закрыл файл? (поэтому нет гарантии, что файл синхронизируется). Попробуйте `.sync() после каждой записи.   -  person progmatico    schedule 03.11.2020
comment
@progmatico это невозможно, потому что я заканчиваю первый шаг (scenario_generation) перед запуском симуляторов. все сценарии генерируются.   -  person Henrique Lima    schedule 03.11.2020


Ответы (1)


Не будучи уверенным, я подозреваю, что вы не храните все переменные, которые, как вы думаете, находятся на полке.

Когда шаги объединены в одном скрипте, если некоторые значения не записаны на полке, вы этого не заметите, потому что вы явно отключаете исключение TypeError`.

Это не рекомендуется, так как ошибки остаются незамеченными. Вероятно, вы сделали это именно для того, чтобы избежать какой-то ошибки, которая происходила.

Поскольку сценарии находятся в одном файле, они имеют общую глобальную область действия. Когда вы считываете значения обратно в глобальную область, а некоторые значения отсутствуют, вы, вероятно, охвачены исходными значениями в той же глобальной области.

Таким образом, вы пропускаете некоторые значения, но когда они вам нужны, они уже были в глобальной области видимости для чтения.

С отдельными файлами больше нет общей глобальной области видимости. Любое отсутствующее значение вызовет ошибку.

Удалите pass и заставьте предложение except печатать текущий ключ и значение, чтобы проверить наличие отсутствующих ключей.

Кроме этого, я не вижу проблем в создании файловых данных для последующего чтения из любых описанных вами процессов/скриптов (учитывая, что нет проблем с кешем/синхронизацией, и вы открываете файлы только для чтения)

person progmatico    schedule 03.11.2020