我有一个调用telnetlib.read_until()的应用程序。在大多数情况下,它工作得很好。然而,当我的应用程序的telnet连接失败时,很难调试确切的原因。是我的脚本还是服务器连接不可靠?(这是一个开发实验室,所以有很多不可靠的服务器)。
我想做的是能够在我的应用程序调用telnetlib.read_until()之前轻松地窥探放置在熟食队列中的数据(希望这样可以避免影响我的应用程序的操作)。
在telnetlib.py里打探一下,我发现'buf‘就是我想要的数据:新添加的数据,而不是窥探'cookedq’造成的重复。我可以在telnetlib.process_rawq()结束之前插入一行,以打印从服务器接收到的处理过的数据。
telnetlib.process_rawq ...
...
self.cookedq = self.cookedq + buf[0]
print("Dbg: Cooked Queue contents = %r" % buf[0] <= my added debug line
self.sbdataq = self.sbdataq + buf[1]这个效果很好。我可以看到几乎完全相同的数据收到我的应用程序,而没有影响它的操作。
问题是:是否有更快捷的方法来实现这一目标?这种方法是基本的,而且可以工作,但是每次升级Python库时,我都必须记住重新修改这个方法。
我简单地扩展telnet.process_rawq()的尝试没有成功,因为buf是telnet.process_rawq()的内部
有没有一种(更多的pythonic)方法来窥探telnetlib.process_rawq()-internal值而不修改telnetlib.py?
谢谢。
发布于 2011-04-06 21:14:19
最简单的方法就是给图书馆打上猴子补丁。将要更改的函数复制并粘贴到源代码中(不幸的是,process_rawq是一个相当大的函数),并根据需要对其进行修改。然后,可以将类中的方法替换为自己的方法。
import telnetlib
def process_rawq(self):
#existing stuff
self.cookedq = self.cookedq + buf[0]
print("Dbg: Cooked Queue contents = %r" % buf[0]
self.sbdataq = self.sbdataq + buf[1]
telnetlib.Telnet.process_rawq = process_rawq您也可以尝试使用set_debuglevel(1)内置到telnetlib模块的调试,它会将大量信息输出到stdout。
在这种情况下,我倾向于抓取wireshark/tshark/tcpdump并直接检查网络会话。
发布于 2012-05-10 16:00:25
我刚刚找到了一个更好的解决方案(通过阅读代码!)
telnetlib已经内置了一个调试输出选项。打电话给set_debuglevel(1),鲍勃是你叔叔。
https://stackoverflow.com/questions/5572778
复制相似问题