pexpect read_nonblocking выдает ошибку ОС - PullRequest
0 голосов
/ 28 апреля 2020

Итак, у меня есть некоторый базовый c python код с потоком, в котором этот поток

lastread = client.read_nonblocking(1000, 0)

Это просто работает в al oop. 90% времени это работает нормально. Иногда я получаю

Traceback (most recent call last):
  File "/usr/lib/python3.6/threading.py", line 916, in _bootstrap_inner
    self.run()
  File "/usr/lib/python3.6/threading.py", line 864, in run
    self._target(*self._args, **self._kwargs)
  File "/home/user/Master_Tool/r_cli.py", line 271, in listen
    lastread = client.read_nonblocking(1000, 0)
  File "/usr/local/lib/python3.6/dist-packages/pexpect/pty_spawn.py", line 458, in read_nonblocking
    if select(0):
  File "/usr/local/lib/python3.6/dist-packages/pexpect/pty_spawn.py", line 450, in select
    return select_ignore_interrupts([self.child_fd], [], [], timeout)[0]
  File "/usr/local/lib/python3.6/dist-packages/pexpect/utils.py", line 143, in select_ignore_interrupts
    return select.select(iwtd, owtd, ewtd, timeout)
OSError: [Errno 9] Bad file descriptor

Я не могу понять, почему это иногда случается. Я работаю на Ubuntu 18.X сервер LTS. Любая помощь очень ценится. Ниже приведена вся функция потока:

def listen(client):
    global listening
    lock.acquire()
    stillisten = listening
    lock.release()
    lastread = ""
    while(stillisten):
        time.sleep(0.2)
        try:
            lastread = client.read_nonblocking(1000, 0)
        except pexpect.exceptions.TIMEOUT:
            continue
        except pexpect.exceptions.EOF:
            break
        if len(lastread)>0:
            lastread = lastread.decode("utf-8")
            reply(lastread)
            lastread = ""
        lock.acquire()
        stillisten = listening
        lock.release()
    lock.acquire()
    client.close(force=True)
    global gclient
    gclient = None
    lock.release()
...