gpt4 book ai didi

Python telnetlib : surprising problem

转载 作者:太空宇宙 更新时间:2023-11-03 13:05:31 26 4
gpt4 key购买 nike

我正在使用 Python 模块 telnetlib 创建一个 telnet session (与国际象棋服务器),我遇到了一个我真的无法解决的问题。以下代码完美运行:

>>> f = login("my_server") #code for login(host) below.
>>> f.read_very_eager()

这会吐出服务器通常在登录时打印的所有内容。然而,当我把它放在一个函数中然后这样调用它时:

>>> def foo():
... f = login("my_server")
... return f.read_very_eager()
...
>>> foo()

我什么也没得到(空字符串)。我可以检查登录是否正确执行,但由于某种原因我看不到文本。那么它在哪里被吞噬了呢?

非常感谢。

为了完整起见,这里是登录(主机):

def login(host, handle="guest", password=""):
try:
f = telnetlib.Telnet(host) #connect to host
except:
raise Error("Could not connect to host")
f.read_until("login: ")
try:
f.write(handle + "\n\r")
except:
raise Error("Could not write username to host")
if handle == "guest":
f.read_until(":\n\r")
else:
f.read_until("password: ")
try:
f.write(password + "\n\r")
except:
raise Error("Could not write password to host")
return f

最佳答案

当您手动尝试时它起作用但在函数中不起作用的原因是因为当您手动尝试它时,服务器有足够的时间对登录使用react并发回数据。当它全部集中在一个函数中时,您将密码发送到服务器,永远不会等待足够长的时间让服务器回复。

如果您更喜欢(可能更正确的)技术答案:

在文件 telnetlib.py(c:\python26\Lib\telnetlib.py 在我的 Windows 计算机上)中,函数 read_very_eager(self) 调用 self.sock_avail()现在,函数 sock_avail(self) 执行以下操作:

def sock_avail(self):
"""Test whether data is available on the socket."""
return select.select([self], [], [], 0) == ([self], [], [])

它的作用非常简单:如果有任何东西要从我们的套接字中读取(服务器已应答),它将返回 True,否则返回 False。

因此,read_very_eager(self) 所做的是:检查是否有任何内容可供阅读。如果有,则从套接字中读取,否则只返回一个空字符串。

如果您查看 read_some(self) 的代码,您会发现它不会检查是否有任何数据可供读取。它会尝试读取直到有可用的内容,这意味着如果服务器在回答您之前需要 100 毫秒,它会等待 100 毫秒再返回答案。

关于Python telnetlib : surprising problem,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4000957/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com