Ошибка Python: io.UsupportedOperation: fileno

Я использую сервер и клиентские программы по этой ссылке: http://www.bogotobogo.com/python/python_network_programming_tcp_server_client_chat_server_chat_client_select.php

Когда я запускаю клиент, я сталкиваюсь со следующей ошибкой:

Traceback (most recent call last):
  File "client.py", line 26, in client
    read_sockets, write_sockets, error_sockets =     select.select(socket_list , [], [])
io.UnsupportedOperation: fileno

Я использую Python 3, но я изменил все строки, используя печать из Python 2 to 3.

Вот код:

while 1:
        socket_list = [sys.stdin, s]
        # Get the list sockets which are readable
        read_sockets, write_sockets, error_sockets = select.select(socket_list , [], [])

Ответ 1

В то время как метод fileno() работает с обычными объектами IO (sys.stdout, sys.stderr, sys.stdin и socket.socket), IDLE Python IDE изменяет ваши объекты ввода-вывода, которые нарушают это.

Итак... если вы получите эту ошибку, запустите команду прямо из Python.

Ответ 2

Недавно я получил эту ошибку (Python 2: AttributeError: экземпляр StringIO не имеет атрибута "fileno"; Python 3: io.UnsupportedOperation: fileno) в тестовых случаях на Travis CI, когда код python выполнял команду и хотел прочитать sys. стандартный вывод

Я предполагаю, что на Travis CI оборачивает вывод команды и возвращает StringIO вместо файлового объекта, как обычно. Как вы можете видеть на веб-странице журнала Travis CI, выходной файл имеет белый цвет, а не цветной, как обычно.

Таким образом, мой способ не состоит в том, чтобы извинить команду, а для запуска экземпляра вашего собственного класса для непосредственного тестирования.

Я искал по всему интернету, но не смог получить решение. Я решил это сам и хочу поделиться с другими.

В случае, если вы все еще не понимаете, что я имел в виду. Вы можете увидеть этот коммит:

https://github.com/martin68/apt-smart/commit/bb8fd766f7d96999a3a3fb79d089cde73c71ce83