2016-10-11 9 views
0

Попытка сериализовать Numpy массив Pyro4 возвращает следующую ошибку типаPyro4 рассол сериализатору NumPy массив

TypeError: don't know how to serialize class <type 'numpy.ndarray'>. Give it vars() or an appropriate __getstate__ 

Код является следующим

import numpy as np 
import Pyro4 

# set pickle serializer 
Pyro4.config.SERIALIZERS_ACCEPTED = set(['pickle','json', 'marshal', 'serpent']) 


@Pyro4.expose 
class test(object): 
    def get_array(self): 
     return np.random.random((10,10)) 


def main(): 
    # create a Pyro daemon 
    daemon = Pyro4.Daemon()  
    # register test instance 
    uri = daemon.register(test()) 
    # print uri to connect to it in another console 
    print uri 
    # start the event loop of the server to wait for calls 
    daemon.requestLoop()     

if __name__=="__main__": 
    main() 

Теперь открыть другую консоль и попытаться вызвать тест например, следующие

import Pyro4 
Pyro4.config.SERIALIZERS_ACCEPTED = set(['pickle','json', 'marshal', 'serpent']) 
# connect to URI which is printed above 
# must be something like this 'PYRO:[email protected]:57495' 
p = Pyro4.Proxy(URI) 
p.get_array() 


Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python2.7/site-packages/Pyro4/core.py", line 171, in __call__ 
    return self.__send(self.__name, args, kwargs) 
    File "/usr/local/lib/python2.7/site-packages/Pyro4/core.py", line 438, in _pyroInvoke 
    raise data 
TypeError: don't know how to serialize class <type 'numpy.ndarray'>. Give it vars() or an appropriate __getstate 

ответ

1

Это указано в руководстве, в котором вы можете сделать так, чтобы lve it: http://pythonhosted.org/Pyro4/tipstricks.html#pyro-and-numpy

В вашем коде выше вы не указали своему клиенту код, чтобы использовать рассол. Для этого вы должны использовать другой элемент конфигурации (SERIALIZER). То, что у вас там, предназначено для пирамидских дьямонов.

+0

Я был здесь раньше, но хочу изменить конфигурацию из кода и не изменять глобальную конфигурационную переменную PYRO_SERIALIZERS_ACCEPTED. Я новичок в пиро, жаль глупых вопросов. – Cobry

+2

Каждый элемент конфигурации (кроме связанного с ведением журнала) может быть установлен как через переменную среды, так и через изменение кода. Обратите внимание, что переменные окружения обычно не являются системными, а для каждого пользователя. В любом случае, вы должны установить Pyro4.config.SERIALIZER = 'pickle' –