Экземпляр известный в оболочке дает NameError при использовании в сценарии? - PullRequest
3 голосов
/ 24 января 2012

Боюсь, я не понимаю чего-то базового.Я использую python в интерактивном режиме с IPython и выполняю более или менее следующий скрипт (VPP - это модуль, который я написал с классом VPP и классом Forecast, оба они расширяются от объекта).

import os
import numpy as np
from VPPP import VPP, Forecast

setup = False
single_run = True

if setup:
    vpp = VPP(foo=foo, bar=bar, ...)  
    forecast = Forecast('my_filename')
    mapping = {'Forecast': 'PConInput.ys[xxx]', 'Price': 'tariffInput.ys[xxx]'}

if single_run:
    fnext = forecast.predict(startday=146, nb_days=2)
    vpp.adapt_forecasts(fnext, mapping)
    vpp.optimize()

У меня естьфлаги setup и single_run, потому что создание экземпляра vpp занимает около 2 минут, и я хочу использовать тот же vpp позже в одном запуске с другими параметрами.

Когда я запускаю скрипт с обоими флагами True, все в порядке.Тем не менее, когда я снова запускаю с setup = False, я получаю сообщение об ошибке: NameError: имя «прогноз» не определено (вызвано fnext = ...).Тем не менее, ввод непосредственно в оболочке IPython, все экземпляры известны, и все команды работают нормально.

Это проблема IPython?Как я могу избежать создания экземпляра моего vpp-объекта каждый раз, когда я хочу запустить свой скрипт?

Заранее спасибо за ваши ответы.Рул

Ответы [ 2 ]

3 голосов
/ 24 января 2012

Запускаете ли вы скрипт с помощью команды IPython %run?

В этом случае используйте:

In [#]: %run -i filename.py

-i запускает файл в пространстве имен IPython (вместо пустого).

Для документации введите %run?<ENTER> в IPython.

2 голосов
/ 24 января 2012

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

Если вам нужно такое поведение, вам придется хранить свои переменные самостоятельно, например, используя pickle (обратите внимание, что это, вероятно, не будет работать, если вы общаетесь с каким-либо удаленным сервером).

Другое решение - запускать скрипт на неопределенный срок и заставлять его выполнять какую-то работу каждые x секунд. Или запросить ввод пользователя:

import os
import numpy as np
from VPPP import VPP, Forecast

vpp = VPP(foo=foo, bar=bar, ...)  
forecast = Forecast('my_filename')
mapping = {'Forecast': 'PConInput.ys[xxx]', 'Price': 'tariffInput.ys[xxx]'}

while True:
    try:
        raw_input('Press enter to start. Ctrl-C to exit.')
    except KeyboardInterrupt:
        break
    fnext = forecast.predict(startday=146, nb_days=2)
    vpp.adapt_forecasts(fnext, mapping)
    vpp.optimize()

Теперь, если вы нажмете Enter, будут выполнены последние три строки. Вы можете нажать Ctrl-C для выхода.

(NB. Для Python 3 изменить raw_input на input.)

...