Форум сайта python.su
Здравствуйте! Только начал писать на python'e и сразу же возник вопрос. Пишу скрипт, который заходит по telnet на определенную железку и собирает с неё различную информацию. Результат собирается командой read_some(). Вопрос в следующем, если собирать данные через read_some() и ждать окнчания (символ chr(32)), то всё нормально, но если после этого еще раз запустить read_some(), то скрипт виснет, т.к. данных больше не поступало, а read_some() их ждет. Как отлавливать эту ситуацию (то что данных больше небыло и read_some() запускать не надо)? Заранее благодарен.
Офлайн
Сделать флаг.
Поменять архитектуру так, что бы функция читания работала только тогда, когда есть данные.
Ввести в read_some() понятие таймаута.
Офлайн
Можно использовать read_eager.
Офлайн
А можно пример того как работает read_eager() ?
Офлайн
Так никто и не поможет? :(
Офлайн
Да просто прочитай внимательно:
read_until(expected, )
Read until the expected string has been seen, or a timeout is
hit (default is no timeout); may block.
read_all()
Read all data until EOF; may block.
read_some()
Read at least one byte or EOF; may block.
read_very_eager()
Read all data available already queued or on the socket,
without blocking.
read_eager()
Read either data already queued or some data available on the
socket, without blocking.
read_lazy()
Read all data in the raw queue (processing it first), without
doing any socket I/O.
read_very_lazy()
Reads all data in the cooked queue, without doing any socket
I/O.
read_sb_data()
Reads available data between SB … SE sequence. Don't block.
И с чем помогать?
- Одно дело если выложен пример, который можно у себя востроизвести. Все просто отлично: скопировал, запустил. Увидел, что не так. Поправил. Выложил обратно. Просто удовольствие отвечать на такие вопросы.
- Другой случай: есть кусок кода. Вырванный из контекста, но довольно большой. Можно что-то понять, догадаться и посоветовать.
- Совсем плохо: “У меня не работает фишка. Помогите”. Если интуиция развита и есть большой опыт работы с используемой системой - можно догадаться. Чаще вникать даже не хочется.
У тебя случай между вторым и третьим.
telnet - библиотека простая как бубен. И документация вполне хорошая (про то, что она на английском - молчать. Уметь читать простые тексты - ОБЯЗАТЕЛЬНОЕ требование).
Примера кода, с другой стороны, нет совсем. Не очень-то понятно, чего ты ожидаешь. И что именно посоветовать. (Это если отбросить общее требование - “хочу чтобы все заработало” и вернуться к конкретным рекомендациям по написанию кода).
Попадать пальцем в небо - лень.
С третьей точки зрения - в telnetlib.py всего 658 строк. Можно бы и самому попробовать понять, как оно работает.
Резюме: на развернутый вопрос большая вероятность адекватного ответа. Примера того, как работает read_eager никто под рукой не имел. Искать в гугле не захотел (и я не хочу, но возможно где-нибудь на Python CookBook уже все опмсали.
Теперь яснее?
Офлайн
a1.0если что то написал поделись кодом плиз. Аналогичная задача стоит.
Так никто и не поможет? sad
Офлайн
Как то так:
При подключении указывается ip, порт, и connection timeout (работает на версиях > 2.5):
terminal = telnetlib.Telnet(ip, 23, 2)
def read_data_until(terminal, expected):
data = ""
while data.find(expected) == -1:
while 1:
try:
piece = terminal.read_some()
except(socket.timeout):
break
if piece == '':
break
data = data + piece
return data
Офлайн