2009-05-15 8 views
2

変数名を取得し、存在するかどうかを確認し、ファイルから(ピクルを使用して)グローバル名前空間にロードする小さな関数を作成しようとしています。Pythonの変数にファイルをロードする

私は、ファイルでこれを使用してみました:

import cPickle 

# 
# Load if neccesary 
# 
def loadfile(variable, filename): 
    if variable not in globals(): 
     cmd = "%s = cPickle.load(file('%s','r'))" % (variable, filename) 
     print cmd 
     exec(cmd) in globals() 

をしかし、それは動作しません - 変数が定義されません。私は間違って何をしていますか?

答えて

2

はそれだけのために働くの問題があります現在のモジュール'グローバル'を渡すのではなく、より良い方法は、 'setattr'組み込み関数を名前空間に直接使うことです。つまり、モジュールと同様にインスタンス上で関数を再利用することができます。

import cPickle 

# 
# Load if neccesary 
# 
def loadfile(variable, filename, namespace=None): 
    if module is None: 
     import __main__ as namespace 
    setattr(namespace, variable, cPickle.load(file(filename,'r'))) 

# From the main script just do: 
loadfile('myvar','myfilename') 

# To set the variable in module 'mymodule': 
import mymodule 
... 
loadfile('myvar', 'myfilename', mymodule) 

モジュール名に注意してください:メインのスクリプトは常にメインモジュールです。 script.pyを実行していて 'import script'を実行しているのであれば、通常はあなたが望むものではないコードの別のコピーが得られます。

2

あなたはなかれ完全に幹部を避けることができます:

 

import cPickle 

# 
# Load if neccesary 
# 
def loadfile(variable, filename): 
    g=globals() 
    if variable not in g: 
     g[variable]=cPickle.load(file(filename,'r')) 

 

EDIT:もちろん、現在のモジュールのグローバル変数にグローバルをロードします。

あなたが別のモジュールのグローバルにものをロードしたい場合は、パラメータとしてそれらに渡すのがベストだろう:「グローバル」を使用して

 

import cPickle 

# 
# Load if neccesary 
# 
def loadfile(variable, filename, g=None): 
    if g is None: 
     g=globals() 
    if variable not in g: 
     g[variable]=cPickle.load(file(filename,'r')) 

# then in another module do this 
loadfile('myvar','myfilename',globals()) 
 
+0

これは、ファイルをexecfileで読み込んだときにのみ機能しますが、読み込み時には読み込まれません。何故ですか?ありがとう! –

+0

おそらく、グローバル変数は、それらが入っているモジュールに対してのみグローバルであるからです。 –

+0

ありがとう。 モジュールからインタプリタのglobals()に自動的にアクセスする方法はありますか? –

関連する問題