Я пытаюсь автоматизировать загрузку данных 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
, но я получаю только часть этого кода.
Спасибо.
# 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.
ls
после отправкаexit
).read_*
прежде чем он хочет получить данные. Таким образом, данные все еще ждут, когда они вызываютread_all
позже. Попробуйте обернуть эти две строки вof.write(...)
.