Python telnetlib未读取全部内容

1 投票
1 回答
5162 浏览
提问于 2025-04-16 19:06

我正在尝试用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命令的结果,但用这段代码只得到了部分内容。

谢谢。

1 个回答

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.

撰写回答