【问题标题】:Loading files into variables将文件加载到变量中
【发布时间】:2009-05-15 11:17:57
【问题描述】:

我正在尝试编写一个获取变量名的小函数,检查它是否存在,如果不存在,则将其从文件(使用 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()

但它不起作用 - 变量没有被定义。我做错了什么?

【问题讨论】:

    标签: python namespaces pickle


    【解决方案1】:

    使用 '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)
    

    注意模块名称:主脚本始终是模块ma​​in。如果您正在运行 script.py 并执行“导入脚本”,您将获得一个单独的代码副本,这通常不是您想要的。

    【讨论】:

      【解决方案2】:

      你总是可以完全避免 exec:

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

      编辑:当然,这只会将全局变量加载到当前模块的全局变量中。

      如果你想将这些东西加载到另一个模块的全局变量中,你最好将它们作为参数传入:

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

      【讨论】:

      • 这仅在我使用 execfile 加载文件时有效,但在我使用 import 加载文件时无效。这是为什么?谢谢!
      • 可能是因为全局变量只对它们所在的模块是全局的。
      • 谢谢。有没有办法自动从模块到解释器的 globals() ?
      • 解释器没有 globals()。最接近的是 builtins
      猜你喜欢
      • 1970-01-01
      • 2013-01-07
      • 2010-11-19
      • 2017-06-29
      • 1970-01-01
      • 1970-01-01
      • 2011-05-25
      • 1970-01-01
      相关资源
      最近更新 更多