Python telnetlib не читает все

1

Я пытаюсь автоматизировать загрузку данных Argos с помощью Python telnetlib, но я не могу понять, как заставить его загружать весь вывод. Часть моей проблемы может заключаться в том, что я действительно не понимаю кажущегося асинхронного характера команд.

Здесь код:

tn = telnetlib.Telnet(host = HOST, timeout = 60)
with open("argos_prv_{0}-1.txt".format(now_str), 'w') as of:
    tn.read_until("Username: ")
    tn.write(user + "\n")
    tn.read_until("Password: ")
    tn.write(password + "\n")
    tn.read_until("/")
    # Here the command I'm trying to get the results of:
    tn.write("prv,,ds,{0:d},009919,009920\n".format(start_doy))
    # At this point, it presumably dumped it all
    tn.read_until("ARGOS READY")
    tn.read_until("/")
    # Logging out
    tn.write("lo\n")
    lines = tn.read_all()
    of.write(lines)
    of.flush()

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

Мне кажется, что он имеет какое-то отношение к попытке read_all() после выхода из системы (tn.write("lo\n")), но когда я смотрю пример документации для telnetlib, он выглядит примерно так.

В любом случае, мой вопрос: может ли кто-нибудь увидеть, что я делаю неправильно здесь? Я хочу получить результаты команды prv,,ds, но я получаю только часть этого кода.

Спасибо.

Теги:
telnetlib

1 ответ

0
# At this point, it presumably dumped it all
tn.read_until("ARGOS READY")
tn.read_until("/")

В предположении, что этот бит всасывает данные и ничего не делает с ним. Подумайте об этом как о парах труб - вы отправляете вещи одним способом с помощью write, и возвращаете материал с помощью read_*. Если вы уже сосали материал, он еще не будет ждать в трубе, когда вы сделаете read_all позже.

EDIT: Хорошо, у вас другая проблема. Попробуйте следующее:

lines = tn.read_until("ARGOS READY")
lines += tn.read_until("/")
tn.write("lo\n")
# Write out lines to file.
  • 0
    Это имело бы смысл, если бы это было синхронно, но если вы посмотрите на пример telnetlib ( docs.python.org/library/telnetlib.html#telnet-example ), они делают то же самое (читая результат команды ls после отправка exit ).
  • 0
    Это не отправка выхода, это проблема. Ключ в том, что этот пример не вызывает read_* прежде чем он хочет получить данные. Таким образом, данные все еще ждут, когда они вызывают read_all позже. Попробуйте обернуть эти две строки в of.write(...) .
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню