1

我正在尝试使用 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命令的结果,但我只是使用这个特定的代码来获取其中的一部分。

谢谢。

4

1 回答 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.
于 2011-06-07T16:26:43.770 回答