@AlikhanPython
Учу программирование на Python.

Как исправить ошибку при передаче массива через socket и pickle в Python?

Хотел я через сокеты в Python передавать массив каждый раз при получении данных от сервера, то есть, клиент подключается к серверу и получает некий массив, массив в сервере, был завернут в pickle.dumps, а в клиенте мы получаем массив при помощи pickle.loads, но при этом вызывается ошибка.

Код сервера:
import socket
import pickle

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(("127.0.0.1", 5467))

class Parser:
    pass

citys = ["Moscow", "New-York", "Paris", "London", "Chikago"]

if __name__ == "__main__":
    server.listen()

    parser = Parser()
    data = pickle.dumps([citys, parser])

    while True:
        user, address = server.accept()
        user.send(data)


Код клиента:
import socket
import pickle

client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(("127.0.0.1", 5467))

new_data = client.recv(65507)
data = pickle.loads(new_data)

print(data)


Но выдает вот такую ошибку:
Traceback (most recent call last):
  File "C:\Users\123\Desktop\client.py", line 8, in <module>
    data = pickle.loads(new_data)
AttributeError: Can't get attribute 'Parser' on <module '__main__' from 'C:\\Users\\123\\Desktop\\client.py'>
  • Вопрос задан
  • 167 просмотров
Решения вопроса 1
@kamenyuga
Pickle сохраняет объекты и ссылки на типы данных (названия классов и функций), но не их определения. Исправить ошибку можно разными путями.
1. Руками сохранить также определение класса.
2. Сделать в классе методы сохранения/загрузки объектов в стандартные типы данных или текст.
3. Использовать библиотеки, которые сразу сериализуют больше данных, например, dill.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы