我正在尝试编写一个获取变量名的小函数,检查它是否存在,如果不存在,则将其从文件(使用 pickle)加载到全局命名空间。
我尝试在文件中使用它:
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()
但它不起作用 - 变量未定义。我做错了什么?
请您参考如下方法:
使用'globals' 的问题是它只适用于当前模块。与其传递“globals”,更好的方法是直接在命名空间上使用内置的“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)
注意模块名称:主脚本始终是模块 main。如果您正在运行 script.py 并执行“导入脚本”,您将获得一份单独的代码副本,这通常不是您想要的。
