2011-05-02 23 views
1

我正在處理分佈式處理項目。 我需要將我的複合數據類型發送給另一個對等體,所以我可以在其他對等體中使用它來填充我的TreeView結構。 我有兩個班在我的「tsk_composite」模塊, 我的複合數據節點:我送我的複合數據使用cPickle發送帶有XML-RPC的複合數據類型

class CTskComposite(object): 
... 
def getRootNode(self): 
     self.getImagePartitions() 
     return self.mParent 

def getImagePartitions(self): 
    #I use this method to create my parentRoot with recursive function 
    #it works good 

class CTskNode(object):  
    def __init__(self, pData, pParent = None): 
     self.mData = pData   
     self.mParent = pParent   
     self.mChildren = [] 

我這把樹形結構的根節點主類使用cPickle的與此代碼:

def _composite(self, pArgs): 
    self.mComposite = CTskComposite(pArgs) 
    self.mCompositeRootNode = self.mComposite.getRootNode() 
    return cPickle.dumps(self.mCompositeRootNode) 

當我收到在我的第二對等端的複合數據,它給此錯誤消息:

ImportError: No module named tsk_composite 

當我創建一個在我的第二對這個名字「tsk_composite」的emty模塊,那麼它給出了這樣的錯誤:

AttributeError: 'module' object has no attribute 'CTskNode' 

當我剛寫這行代碼的模塊中我的第二個同伴,它的工作完美。

class CTskNode(object):pass 

其實我並不需要這個模塊和類,我怎麼能僅僅通過cPickle的導入模塊和類名其他同行?

回答

4

當Pickle序列化一個對象時,它序列化一個存儲屬性名稱/值和類名稱(全名,模塊路徑)而不是方法定義的ditionnary。

反序列化時,它重新創建一個具有相同類的對象,並將保存的屬性設置爲該對象。

爲了重新創建對象,pickle嘗試在客戶端導入類,如果它不存在,它會引發你看到的異常。

爲了避免這種情況,我看到2個解決方案:

  • 你必須做出源提供給您的客戶端模塊,所以取儲存就會發現源的對象時。
  • 你可以重新創建一個虛擬模塊(具有相同路徑,類名和屬性)(如果這些對象的唯一需要的是屬性hanlding)
+0

感謝您的快速回復。但是,我無法將我的源代碼提供給我的客戶端,並且它似乎不是創建我真正不需要的虛擬模塊的好方法。 你有沒有其他建議可以使用XML-RPC發送數據,除了泡菜? – zekifh 2011-05-02 14:04:46

+2

您可以嘗試發送由屬性名稱和值組成的字典,它應該足夠。 – 2011-05-02 14:33:55