Причина, по которой это работает, когда вы пробуете его вручную, а не в функции, заключается в том, что, когда вы пробуете его вручную, у сервера достаточно времени, чтобы отреагировать на вход в систему и отправить данные обратно.Когда все в одной функции, вы отправляете пароль на сервер и никогда не ждете, пока сервер ответит.
Если вы предпочитаете (возможно, более правильный) технический ответ:
Вфайл telnetlib.py (c: \ python26 \ Lib \ telnetlib.py на моем компьютере с Windows), функция read_very_eager(self)
вызывает self.sock_avail()
Теперь функция sock_avail(self)
выполняет следующие действия:
def sock_avail(self):
"""Test whether data is available on the socket."""
return select.select([self], [], [], 0) == ([self], [], [])
Что этоdo действительно прост: если есть что-нибудь- для чтения из нашего сокета (сервер ответил), он вернет True, в противном случае он вернет False.
Итак, что read_very_eager(self)
делает, так это: проверьте, есть ли что-нибудь доступное для чтения.Если есть, то читайте из сокета, иначе просто верните пустую строку.
Если вы посмотрите на код read_some(self)
, вы увидите, что он не проверяет, есть ли какие-либо данные, доступные длячитать.Он будет пытаться читать до тех пор, пока не появится что-то доступное, что означает, что если сервер берет, например, 100 мс, прежде чем ответить вам, он будет ждать 100 мс, прежде чем вернуть ответ.