2012-04-07 1 views
1

Я пытаюсь запустить скрипт «начать работу с рассолами». Мне удалось сохранить файл pickle из файла и загрузить его. Но когда я сохраняю файл pickle в одном файле (main.py в этом случае) и загружаю его из другого, я получаю сообщение об ошибке. Я, наверное, пропустил что-то маленькое, но не могу понять, что.loading pickle file

main.py

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

import pickle 
import main 


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

Ошибка

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 импортирован, но Я понятия не имею, как заставить его работать.

ответ

0

Это, как представляется, связано с тем, как классы определены по отношению к модулю. Быстрый способ, чтобы позволить этому работать, чтобы импортировать компоненты main модуля непосредственно в pickleLoader:

from main import Graph, Node, Link 

Лучшее решение могло бы быть, чтобы переместить общие компоненты (Graph, Node, Link) в свой собственный модуль, а затем импортировать этот модуль в оба: main и pickleLoader.

+0

Спасибо, что его работа. Но почему лучше переместить эти 3 компонента в другой модуль? Что это изменит? –

+1

Помещение их в отдельный модуль (и импорт этого модуля) поможет избежать конфликтов пространства имен. Для текущего подхода требуется, чтобы типы вводились в текущее пространство имен. Размещение их в отдельном модуле и импорт, который сохранит их в своем собственном пространстве имен. – DRH

 Смежные вопросы

  • Нет связанных вопросов^_^