3

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

>>> 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
4

2 回答 2

5

当您手动尝试但在函数中无效的原因是,当您手动尝试时,服务器有足够的时间对登录做出反应并将数据发回。当这一切都在一个功能中时,您将密码发送到服务器并且永远不会等待足够长的时间让服务器回复。

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

在文件 telnetlib.py(我的 Windows 计算机上的 c:\python26\Lib\telnetlib.py)中,函数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], [], [])

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

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

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

于 2011-01-26T14:20:31.633 回答
3

I'm having the same trouble as you, unfortunately the combination of select.select, which I have in a while loop until I am able to read, and then calling read_some() does not work for me, still only reading 1% of the actual output. If I put a time.sleep(10) on before I read and do a read_very_eager() it seems to work...this is a very crude way of doing things but it does work..I wish there was a better answer and I wish I had more reputation points so I could respond to user387821 and see if he has any additional tips.

于 2012-11-07T02:00:17.743 回答