You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 11:50:24