Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 1, 2009 21:55:53

a1.0
От:
Зарегистрирован: 2009-04-01
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

telnetlib и read_some()

Здравствуйте! Только начал писать на python'e и сразу же возник вопрос. Пишу скрипт, который заходит по telnet на определенную железку и собирает с неё различную информацию. Результат собирается командой read_some(). Вопрос в следующем, если собирать данные через read_some() и ждать окнчания (символ chr(32)), то всё нормально, но если после этого еще раз запустить read_some(), то скрипт виснет, т.к. данных больше не поступало, а read_some() их ждет. Как отлавливать эту ситуацию (то что данных больше небыло и read_some() запускать не надо)? Заранее благодарен.



Офлайн

#2 Апрель 2, 2009 02:21:13

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

telnetlib и read_some()

Сделать флаг.
Поменять архитектуру так, что бы функция читания работала только тогда, когда есть данные.
Ввести в read_some() понятие таймаута.

Офлайн

#3 Апрель 2, 2009 13:57:02

Viper
От:
Зарегистрирован: 2006-11-08
Сообщения: 137
Репутация: +  0  -
Профиль   Отправить e-mail  

telnetlib и read_some()

Можно использовать read_eager.



Офлайн

#4 Апрель 4, 2009 01:23:01

a1.0
От:
Зарегистрирован: 2009-04-01
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

telnetlib и read_some()

А можно пример того как работает read_eager() ?



Офлайн

#5 Апрель 9, 2009 03:59:17

a1.0
От:
Зарегистрирован: 2009-04-01
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

telnetlib и read_some()

Так никто и не поможет? :(



Офлайн

#6 Апрель 9, 2009 05:26:07

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

telnetlib и read_some()

Да просто прочитай внимательно:

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 уже все опмсали.

Теперь яснее?



Офлайн

#7 Март 2, 2010 20:26:31

qman
От:
Зарегистрирован: 2007-07-02
Сообщения: 444
Репутация: +  0  -
Профиль   Отправить e-mail  

telnetlib и read_some()

a1.0
Так никто и не поможет? sad
если что то написал поделись кодом плиз. Аналогичная задача стоит.



Офлайн

#8 Март 3, 2010 09:19:36

a1.0
От:
Зарегистрирован: 2009-04-01
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

telnetlib и read_some()

Как то так:

При подключении указывается 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
Дальше можно совершенствовать до бесконечности :)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version