2012-01-24 1 views
3

私は何か基本的なことを理解していないのでしょうか?私はIPythonと対話的にPythonを使用し、次のスクリプトを実行しています(VPPはVPPクラスとForecastクラスで書かれたモジュールですが、どちらもオブジェクトから拡張されています)。シェルで既知のインスタンスはスクリプトで使用されるとNameErrorを返しますか?

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

VPPのインスタンス化は、約2分かかりますので、私は、フラグsetupsingle_runを持っている、と私は別のパラメータを使用して、後に単一の実行で同じVPPを使用します。

両方のフラグがTrueのスクリプトを実行すると、すべて正常です。しかし、setup = Falseで再度実行すると、errormessageが表示されます。NameError:name 'forecast'が定義されていません(fnext = ...によって引き起こされます)。しかし、IPythonシェルに直接入力すると、すべてのインスタンスがわかり、すべてのコマンドが正常に動作します。

これはIPythonの問題ですか?スクリプトを実行するたびに、どのように私のvppオブジェクトのインスタンス化を避けることができますか?

お返事ありがとうございます。 Roel

+0

? –

+0

実際、 'single_run'にはもっと多くのコマンドがあります。私がしたいのは、startdayのようないくつかのパラメータを変更し、vppと予測オブジェクトを再インスタンス化せずに一連のコマンドを実行することです。 – saroele

答えて

3

IPython %runコマンドを使用してスクリプトを実行していますか?その場合の使用には

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

-iはIPythonの名前空間内のファイル(代わりの空1)を実行します。

ドキュメントについては、IPythonに%run?<ENTER>と入力してください。

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を押すと、最後の3行が実行されます。 Ctrl-Cで終了できます。

inputにN.B. Python用3変更raw_input。)それはあなたのスクリプトの中で、彼らは明らかに一度だけ使用グローバル変数だときあなたは、単一の実行で再びそれらを使用していることをどのように

+0

私はあなたの提案がraw_inputを使用して新しい開始日を予測に渡すように() 方法。私は単一のパラメータを変更したいが、おそらくいくつかのケースでは便利かもしれないが、それはおそらく有用だろう。 – saroele

関連する問題