Задать вопрос
@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'>
  • Вопрос задан
  • 217 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@kamenyuga
Pickle сохраняет объекты и ссылки на типы данных (названия классов и функций), но не их определения. Исправить ошибку можно разными путями.
1. Руками сохранить также определение класса.
2. Сделать в классе методы сохранения/загрузки объектов в стандартные типы данных или текст.
3. Использовать библиотеки, которые сразу сериализуют больше данных, например, dill.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
Greenway Global Новосибирск
от 150 000 ₽
SPA2099 Москва
До 100 000 ₽
HR Prime Москва
от 300 000 до 3 800 000 ₽