2012-03-25 5 views
1

pickleを使用してクラスのインスタンスをエンコードし、ソケットを介して送信し、もう一方の端にデコードしますend AttributeError: 'module' object has no attribute ''は、pickle.loads()を呼び出すときにスローされます。周りグーグルで後私はピクルスが正しく、それはパケットAttributeError:ソケット上のpickleを使用するときに 'module'オブジェクトに属性がありません

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) 
を受信するための名前に

機能を持っていない属性を探している理由definition.Iを把握することはできませんクラスを含むモジュールをインポートしている確認しました

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'しようとしましたが、同じ側に手動で再度ロードしましたか?反対側に? – katrielalex

答えて

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:]) 

すべてのバイトを送信することができるまで、これはブロックされますことを心に留めておいてください。それを望まないなら、これをselectループに統合する必要があります。

データのハッシュを印刷すると、エラーがデータを送信しているかどうかを判断するうえで有用なテストになります。

関連する問題