我害怕我不懂基本的东西。我和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()
我有标志setup
和single_run
,因为vpp的实例化大约需要2分钟,我希望稍后在不同参数的单次运行中使用相同的vpp。
当我使用两个标志True
运行脚本时,一切都很好。但是,当我再次使用setup = False
运行时,我收到错误消息:NameError:未定义名称'forecast'(由fnext = ...
引起)。但是,直接在IPython shell中输入,所有实例都是已知的,所有命令都可以正常工作。
这是一个IPython问题吗?每次我想运行脚本时,如何避免我的vpp对象的实例化?
预先感谢您的回答。 罗埃尔
答案 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
。)