shell中使用的实例在脚本中使用时会产生NameError吗?

时间:2012-01-24 19:36:05

标签: python ipython

我害怕我不懂基本的东西。我和IPython交互使用python,我或多或少地运行以下脚本(VPP是我用类VPP编写的模块和类预测,它们都是从对象扩展的。)

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()

我有标志setupsingle_run,因为vpp的实例化大约需要2分钟,我希望稍后在不同参数的单次运行中使用相同的vpp。

当我使用两个标志True运行脚本时,一切都很好。但是,当我再次使用setup = False运行时,我收到错误消息:NameError:未定义名称'forecast'(由fnext = ...引起)。但是,直接在IPython shell中输入,所有实例都是已知的,所有命令都可以正常工作。

这是一个IPython问题吗?每次我想运行脚本时,如何避免我的vpp对象的实例化?

预先感谢您的回答。 罗埃尔

2 个答案:

答案 0 :(得分:3)

您是否使用IPython %run命令运行脚本?

在这种情况下使用:

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

-i在IPython的命名空间中运行该文件(而不是空的)。

对于文档,请在IPython中键入%run?<ENTER>

答案 1 :(得分:2)

每当你在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退出。

(N.B。for Python 3将raw_input更改为input。)