2010-10-22 140 views
3

我正在使用Python模块telnetlib创建一个telnet会话(与一个国际象棋服务器),并且我遇到了一个问题,我真的无法环绕我的大脑。下面的代码完美地起作用:Python telnetlib:令人惊讶的问题

>>> 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 
+0

尝试'print foo()' – ghostdog74 2010-10-22 23:11:59

+0

没有区别。 – ptz 2010-10-23 09:41:24

+1

我发现,如果不是使用read_very_eager(),而是使用read_until(),它确实有效。它应该是关于传输数据的协议和方式,而我没有必要的技术背景。 – ptz 2010-10-23 09:59:41

回答

5

之所以当您手动,但不尝试一下当一个功能是因为当您手动尝试一下,服务器有这个工程有足够的时间对登录做出反应并将数据发回。当它全部在一个功能中时,您将密码发送到服务器,并且永远不会等待服务器回复足够长的时间。

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

在文件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], [], []) 

这样做什么是非常简单的:如果有-anything-从我们的插座(服务器已回答)读取,它会返回true,否则它会返回False。

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

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

3

我和你有同样的麻烦,不幸的是,select.select,我在while循环中,直到我能够读取,然后调用read_some()不起作用,我仍然只读取实际输出的1%。如果我在读取read_very_eager()之前先写入time.sleep(10),它似乎可以工作......这是一种非常粗糙的做事方式,但它确实有效。我希望有更好的答案,并且我希望我有更多的声望点,所以我可以回应用户387821,看看他是否有任何额外的提示。

相关问题