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文件以供以后测试。在解释器 shell 会话中加载该文件,加载它cPickle.loads()并查看会发生什么。pickle对模块执行相同的操作。

如果您在此测试会话中确实遇到了类似的问题,并且您可以重现它(在会话的稍后时间点抛出奇怪的异常),您需要在 Python 项目中提交一个错误以进行查看。

于 2013-02-10T00:07:51.123 回答