2012-03-25 17 views
1

我試圖用泡菜來編碼一個類的實例和整個插座發送它,它在另一端進行解碼,但是在到達其他調用pickle.loads()時拋出結尾AttributeError: 'module' object has no attribute ''。圍繞谷歌搜索後,我證實,鹹菜正確導入包含類definition.I想不通模塊爲什麼它尋找一個沒有名字AttributeError的:「模塊」對象有沒有屬性「」使用泡菜在套接字時

函數用來接收分組

def run(self): 
    while self.alive.isSet(): 
     try: 
      cmd = self.cmd_q.get(True, 0.1) 
      self.log.debug('Q Returned') 
      self.handlers[cmd.type](cmd) 
     except Queue.Empty as e: 
      #self.log.debug('Q Returned Empty') 
      pass 

     if self.connected.isSet(): 
      self.log.debug('checking packets') 
      if self.conn: 
       x = select.select((self.conn,),(),(), 0.1) 
       self.log.debug('SERVER returned') 
      else: 
       x = select.select((self.sock,),(),(), 0.1) 
       self.log.debug('CLIENT returned') 
      if len(x[0]) != 0: 
       self.log.debug('Got Packet') 
       packet = x[0][0].makefile('rwb').readline() 
       self.__reply_receive(packet) 
一個屬性

用於發送

def __handle_send(self, cmd): 
    self.log.debug('Sending.....') 
    if self.connected.isSet(): 
     packet = pickle.dumps(cmd.data,pickle.HIGHEST_PROTOCOL) 
     if self.conn: 
      self.conn.send(packet + '\n') 
     else: 
      self.sock.send(packet + '\n') 
    self.log.debug('Sent!') 

的功能和類定義

class Packet(object): 
""" 
    LINEUP  (line) 
    UPDATE  (dict) 
    INPUT  (line) 
    DISCONN  None 
    TEST  (line) 
""" 
LINEUP, UPDATE, INPUT, DISCONN, TEST = range(5) 
def __init__(self, type, data = 'blarg'): 
    self.type = type 
    self.data = data 
+0

你試過'print'ing傾銷的字符串,並手動在同一側再次加載呢?另一方面? – katrielalex 2012-03-25 21:58:26

回答

1

我不認爲你可以依靠pickle.dumps的結果不包含任何新行。你需要另一種方法來找出酸洗物體結束的地方。你可以通過首先發送長度來做到這一點。 (pickle.load可以確定對象結束的位置,但它必須阻止,直到可以讀取整個對象。)

您使用socket.send方法不正確。它可以發送比請求更少的字節,並且它會返回發送的字節數。你需要做一個循環發送剩餘的字節,這樣的事情:

def send_all(sock, string): 
    bytes_sent = 0 
    while bytes_sent < len(string): 
     bytes_sent += sock.send(string[bytes_sent:]) 

請記住,這將阻塞,直到所有字節可以發送。如果你不想這樣做,你將不得不將它整合到一個選擇循環中。

打印數據的哈希值可能會是一個有用的測試,找出錯誤是在傳輸數據或酸洗/取儲存它。

相關問題