2009-05-15 8 views
2

J'essaye d'écrire une petite fonction qui obtient un nom de variable, vérifie si elle existe, et si elle ne le charge pas depuis un fichier (utilisant pickle) vers l'espace de noms global.Chargement de fichiers dans des variables en python

J'ai essayé d'utiliser ceci dans un fichier:

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

Mais il ne fonctionne pas - la variable ne soit pas définie. Qu'est-ce que je fais mal?

Répondre

2

En utilisant « GLOBALS » a le problème que cela ne fonctionne que pour le module actuel. Plutôt que de faire circuler des "globals", il vaut mieux utiliser le "setattr" intégré directement sur un espace de noms. Cela signifie que vous pouvez réutiliser la fonction sur des instances et des modules.

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) 

Soyez prudent sur le nom du module: le script principal est toujours un module principal. Si vous lancez script.py et faites 'script d'importation', vous obtiendrez une copie séparée de votre code qui n'est généralement pas ce que vous voulez.

2

Vous pouvez alway éviter exec tout:

 

import cPickle 

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

 

EDIT: bien sûr que ne charge que les globals dans les GLOBALS du module en cours.

Si vous voulez charger les choses dans les GLOBALS d'un autre module, vous seriez mieux de passer en eux comme paramètre:

 

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

Cela ne fonctionne que lorsque je charge mon fichier avec execfile, mais pas quand je le charge avec l'importation. Pourquoi donc? Merci! –

+0

Probablement parce que les variables globales ne sont globales que pour le module dans lequel elles se trouvent. –

+0

Merci. Existe-t-il un moyen de passer automatiquement d'un module à la globals() de l'interpréteur? –

Questions connexes