Python telnetlib: удивительная проблема

Я использую модуль telnetlib для Python для создания сеанса telnet (с шахматным сервером), и у меня есть проблема, которую я действительно не могу обернуть вокруг себя. Следующий код работает отлично:

>>> f = login("my_server") #code for login(host) below. >>> f.read_very_eager() 

Это выплевывает все, что обычно печатает сервер при входе в систему. Однако, когда я помещаю его внутри функции, а затем вызываю ее так:

 >>> def foo(): ... f = login("my_server") ... return f.read_very_eager() ... >>> foo() 

Я ничего не получаю (пустая строка). Я могу проверить, что логин выполнен правильно, но по какой-то причине я не вижу текст. Итак, где он проглатывается?

Большое спасибо.

Для полноты, вот логин (хост):

 def login(host, handle="guest", password=""): try: f = telnetlib.Telnet(host) #connect to host except: raise Error("Could not connect to host") f.read_until("login: ") try: f.write(handle + "\n\r") except: raise Error("Could not write username to host") if handle == "guest": f.read_until(":\n\r") else: f.read_until("password: ") try: f.write(password + "\n\r") except: raise Error("Could not write password to host") return f 

2 Solutions collect form web for “Python telnetlib: удивительная проблема”

Причина, по которой это работает, когда вы пытаетесь выполнить ее вручную, но не в том случае, когда функция используется, потому что, когда вы проверяете ее вручную, сервер имеет достаточно времени, чтобы реагировать на логин и отправлять данные обратно. Когда все в одной функции, вы отправляете пароль на сервер и никогда не дожидаетесь достаточно долго, чтобы сервер ответил.

Если вы предпочитаете (вероятно, более правильный) технический ответ:

В файле 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], [], []) 

То, что это делает, очень просто: если есть что-нибудь, чтобы читать из нашего сокета (сервер ответил), он вернет True, иначе он вернет False.

Итак, что такое read_very_eager(self) : проверьте, есть ли что-нибудь доступное для чтения. Если есть, то прочитайте из сокета, иначе просто верните пустую строку.

Если вы посмотрите на код read_some(self) вы увидите, что он не проверяет наличие данных для чтения. Он попытается прочитать, пока не появится что-то доступное, а это означает, что, если сервер принимает, например, 100 мс, перед ответом на вас, он будет ждать 100 мс, прежде чем возвращать ответ.

У меня такие же проблемы, как и вы, к сожалению, сочетание select.select, которое у меня есть в цикле while, пока я не умею читать, а затем вызов read_some () не работает для меня, но только чтение 1% фактический выход. Если я положил time.sleep (10), прежде чем я прочитал и сделаю read_very_eager (), это сработает … это очень грубый способ делать что-то, но он работает. Хотелось бы, чтобы был лучший ответ и Мне жаль, что у меня больше очков репутации, поэтому я мог бы ответить на user387821 и посмотреть, есть ли у него дополнительные советы.

Python - лучший язык программирования в мире.