0

私が書いたコードは正常に機能するようになり、逆シリアル化されたオブジェクトを間違いなく印刷できるので、そこに何が含まれているかを正確に把握できます。

@staticmethod
def receiveData(self):
    '''
    This method has to be static, as it is the argument of a Thread.
    It receives Wrapperobjects from the server (as yet containing only a player)
    and resets the local positions accordingly
    '''

    logging.getLogger(__name__).info("Serverinformationen werden nun empfangen")
    from modules.logic import game
    sock = self.sock
    time.sleep(10)
    self.myPlayer = game.get_player()
    while (True):
        try:
            wrapPacked = sock.recv(4096)
            self.myList = cPickle.loads(wrapPacked)
         #   self.setData(self.myList)             
        except Exception as eload:            
            print eload

ただし、ここのコメントにある行(self.setData(self.myList))を実際に使用しようとすると、

私は得る

unpickling stack underflow

invalid load key, ' '.

念のため、setDataのコードは次のとおりです。

def setData(self, list):    
    if (list.__sizeof__()>0):
        first = list [0]
        self.myPlayer.setPos(first[1])
        self.myPlayer.setVelocity(first[2])

私はこれを3日間続けていますが、実際、何が悪いのかわかりません。手伝って頂けますか?完全なトレースバック:

Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 551, in __bootstrap_inner
    self.run()
  File "/usr/lib/python2.7/threading.py", line 504, in run
    self.__target(*self.__args, **self.__kwargs)
  File "mypath/client.py", line 129, in receiveData
    self.myList = cPickle.loads(wrapPacked)
UnpicklingError: unpickling stack underflow –
4

1 に答える 1

1

cPickleピクルス化されたデータにアクセスしようとすると常に例外が発生するという事実は、代わりにライブラリのバグに遭遇していることを示しているようです。

発生する可能性があるのは、Cライブラリが例外の処理を忘れることです。例外情報は保存され、処理されず、別の例外が発生するか、別のCコード例外をチェックするまでインタープリターに保持されます。この時点で、代わりに古い未処理の例外がスローされます。

エラーは明らかにcPickle関連しており、フィードするデータについては非常に不満ですが、例外自体は関連のない場所でスローされます。これスレッド関連である可能性があり、通常の非スレッド関連のバグである可能性があります。

テスト設定でデータをロードできるかどうかを確認する必要があります。wrapPacked後でテストするためにファイルに書き込みます。そのファイルをインタプリタシェルセッションにロードし、でロードしてcPickle.loads()、何が起こるかを確認します。モジュールでも同じようにしpickleます。

このテストセッションで同様の問題が発生し、それを再現できる場合(セッションの後半で奇妙な例外がスローされる)、これを確認するためにPythonプロジェクトにバグを報告する必要があります。

于 2013-02-10T00:07:51.123 に答える