我正在尝试使用Python的telnetlib自动下载Argos数据,但我似乎无法弄清楚如何让它下载所有输出。我的部分问题可能是我并不真正了解这些命令看似异步的特性。
以下是代码:
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's 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's 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
命令的结果,但我只是使用这个特定的代码获得了一些。
感谢。
答案 0 :(得分:0)
# At this point, it's presumably dumped it all
tn.read_until("ARGOS READY")
tn.read_until("/")
猜测一下,这一点正在吸收数据并且无所事事。可以把它想象成一对管道 - 你用write
单向发送东西,然后用read_*
拉回东西。如果你已经把这些东西搞砸了,那么当你稍后read_all
时,它仍然不会在管道中等待。
编辑: 好的,你看到了另一个问题。试试这个:
lines = tn.read_until("ARGOS READY")
lines += tn.read_until("/")
tn.write("lo\n")
# Write out lines to file.