Python telnetlib没有阅读所有内容

时间:2011-06-07 16:18:04

标签: python telnetlib

我正在尝试使用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 :(得分: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.