Почему протокол сокета pySerial не поддерживает fileno()?

#python #sockets #pyserial #uart #pexpect

#python #сокеты #pyserial #uart #pexpect

Вопрос:

Моя цель — иметь возможность использовать модуль python expect в последовательном интерфейсе uart.

Я пытаюсь подключить модуль python pySerial ( serial ) к pexpect модулю. Тем не менее, я получаю доступ к последовательному порту удаленно через сокет с serial.serial_for_url() функцией, использующей протокол сокета.

При этом происходит сбой, потому что select() необходимо fileno() определить в последовательном объекте. Я получаю следующую ошибку: io.UnsupportedOperation: fileno

Почему протокол сокета может использовать socket.fileno() ? Я попробовал это, и, похоже, он работает должным образом под Linux.

Есть ли какая-либо причина, по которой это не должно поддерживаться по умолчанию в serial.urlhandlers.protocol_socket.py ?

Редактировать:

Я запустил следующее:

 >>> import serial
>>> import fdpexpect
>>> fd = serial.serial_for_url('socket://10.28.1.15:7002')
>>> px = fdpexpect.fdspawn(fd, logfile=open('test.log','w'))
  

Обратите внимание, что вам нужно оборудование с мостом uart-to-network. Я использую Digi32CM в этом конкретном тесте, но это не совсем актуально.

Когда я запускаю fdspawn() функцию, я получаю следующую ошибку:

 Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "python2.7/site-packages/pexpect/fdpexpect.py", line 45, in __init__
    fd = fd.fileno()
io.UnsupportedOperation: fileno
  

Serial Объект pySerial не определяет fileno() функцию, даже если она основана на сокете и может использовать сокет fileno. Когда я попытался добавить его, операция, похоже, работает нормально:

 def fileno(self):
    return self._socket.fileno()
  

Мне интересно, не упускаю ли я чего-то?

Комментарии:

1. Вы должны показать некоторый код, предпочтительно небольшую автономную программу, которую можно вырезать и вставить в файл, и демонстрирует проблему при выполнении.

2. Кроме того, fileno() на последовательном объекте поддерживается только на платформах UNIX, согласно документации. На какой платформе вы работаете?

3. Какая у вас версия pySerial?

4. Я использую pySerial версии 2.7 и pexpect версии 3.3

5. Это просто не реализовано. Вы уже выяснили, как это реализовать самостоятельно. Исходный код.

Ответ №1:

Для информации, fileno() был добавлен в pyserial несколько лет назад, теперь он работает нормально.