如何在Socket另一端无类引用时传输自定义Python对象
如何在无类引用的Socket端重建自定义Python对象
我需要从客户端向服务器发送自定义Python对象,但遇到一个问题:只有服务器脚本中包含该对象的类声明时,才能正确重建对象;如果注释掉类声明,无论是用pickle还是jsonpickle传输,都会重建失败。
这是我正在开发的ChimeraPy项目的简化场景,目标是让服务器向客户端分发自定义代码,利用客户端的算力执行计算。Pyro这类代理工具无法像集群一样分配计算负载,因此不符合需求。
服务器代码
from socket import socket, gethostbyname, AF_INET, SOCK_DGRAM import pickle import jsonpickle OPTION = 'pickle' PORT_NUMBER = 5000 SIZE = 4000 # 原本需要(但我不想保留!) # class A: # ... s = socket(AF_INET, SOCK_DGRAM) s.bind((gethostbyname('0.0.0.0'), PORT_NUMBER)) (data,addr) = s.recvfrom(SIZE) print(data) if OPTION == 'pickle': output = pickle.loads(data) print(output) elif OPTION == 'jsonpickle': output = jsonpickle.decode(data) print(output)
客户端代码
import sys from socket import socket, AF_INET, SOCK_DGRAM import pickle import jsonpickle OPTION = 'pickle' SERVER_IP = '127.0.0.1' PORT_NUMBER = 5000 class A: ... a = A() s = socket(AF_INET, SOCK_DGRAM) s.connect((SERVER_IP, PORT_NUMBER)) if OPTION == 'pickle': s.send(pickle.dumps(a)) elif OPTION == 'jsonpickle': s.send(jsonpickle.encode(a).encode())
输出结果
服务器端包含类A时的输出
$ python server.py # jsonpickle b'{"py/object": "__main__.A"}' <__main__.A object at 0x7f4557a675e0> $ python server.py # pickle b'\x80\x04\x95\x15\x00\x00\x00\x00\x00\x00\x00\x8c\x08__main__\x94\x8c\x01A\x94\x93\x94)\x81\x94.' <__main__.A object at 0x7fcab9fc9bb0>
服务器端不包含类A时的输出
$ python server.py # pickle b'\x80\x04\x95\x15\x00\x00\x00\x00\x00\x00\x00\x8c\x08__main__\x94\x8c\x01A\x94\x93\x94)\x81\x94.' Traceback (most recent call last): File "/home/eduardo/Downloads/SO_Question/server.py", line 21, in <module> output = pickle.loads(data) AttributeError: Can't get attribute 'A' on <module '__main__' from '/home/eduardo/Downloads/SO_Question/server.py'> $ python server.py # jsonpickle b'{"py/object": "__main__.A"}' {'py/object': '__main__.A'}
已尝试的方案
- 查阅相关Stack Overflow问题
- 测试使用jsonpickle传输类,但无法重建对象
- 深入研究jsonpickle文档,未找到可行解决方法
期望目标
找到一种在Socket通信的另一端没有类引用时,仍能成功传输并重建自定义Python对象的解决方案。
内容的提问来源于stack exchange,提问作者Eduardo Davalos
相关产品推荐
相关产品推荐

