首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加载pickle文件

加载pickle文件
EN

Stack Overflow用户
提问于 2012-04-08 07:06:36
回答 1查看 1.9K关注 0票数 1

我正在尝试一个“开始使用泡菜”的脚本。我设法从一个文件中保存了一个pickle文件,并加载了它。但是当我在一个文件(本例中是main.py )中保存一个pickle文件并从另一个文件中加载它时,我得到了一个错误。我可能漏掉了一些小东西,但我搞不清楚是什么。

main.py

代码语言:javascript
复制
import pickle

class Node:
  """This class represents a node"""

  def __init__(self, value = None):
    self.val = value

  def toString(self):
    return self.val


class Link:
  """This class represents a link between 2 nodes"""

  def __init__(self, sourceNode, targetNode, LinkWigth):
    self.source = sourceNode
    self.target = targetNode
    self.wight = LinkWigth

  def setWeight(self, newWeight):
    self.wight = newWeight

  def toString(self):
    return self.wight

class Graph:
  """This class represents a graph"""

  def __init__(self):
    self.nodes = []
    self.links = []

  def addNode(self, node):
    self.nodes.append(node)

  def addLink(self, link):
    self.links.append(link)

  def getInDegree(self, node):
    counter = 0
    for link in self.links:
      if link.target == node:
        counter +=1
      else:
        print "target is: %s" % link.target.toString()
        print "source is: %s" % link.source.toString()
    return counter

  def toString(self):
    for link in self.links:
        print link.toString()
    for node in self.nodes:
        print node.toString()


if __name__ == "__main__":
    n1 = Node(4)
    l1 = Link(n1, n1, 1)
    g = Graph()
    g.addNode(n1)
    g.addLink(l1)
    pickle.dump(g, open('haha', 'wb') )

pickleLoader.py

代码语言:javascript
复制
import pickle
import main


n = main.Node(44)
print n.toString()
g = pickle.load( open('haha', 'rb') )
print "ha"

错误

代码语言:javascript
复制
C:\Users\R\Desktop\pickle test>main.py

C:\Users\R\Desktop\pickle test>pickleLoader.py
44
Traceback (most recent call last):
  File "C:\Users\R\Desktop\pickle test\pickleLoader.py", line 7, in <module>

    g = pickle.load( open('haha', 'rb') )
  File "C:\Program Files\Python27\lib\pickle.py", line 1378, in load
    return Unpickler(file).load()
  File "C:\Program Files\Python27\lib\pickle.py", line 858, in load
    dispatch[key](self)
  File "C:\Program Files\Python27\lib\pickle.py", line 1069, in load_inst
    klass = self.find_class(module, name)
  File "C:\Program Files\Python27\lib\pickle.py", line 1126, in find_class
    klass = getattr(mod, name)
AttributeError: 'module' object has no attribute 'Graph'

C:\Users\R\Desktop\pickle test>

我猜问题出在名称空间上,因为main.py已经导入了,但我不知道如何让它工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-08 07:58:14

这似乎与类是如何相对于模块定义的有关。一种快速的方法是将main模块的组件直接导入到pickleLoader

代码语言:javascript
复制
from main import Graph, Node, Link

更好的解决方案可能是将通用组件(图形、节点、链接)移动到它们自己的模块中,然后将该模块导入到mainpickleLoader中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10059086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档