假设由“什么的代码行确实”你的意思是“什么协议消息被发送和从服务器接收”,smtplib.SMTP.set_debuglevel(level)
:
设置调试输出级别。级别的真值会导致连接的调试消息以及发送到服务器和从服务器接收的所有消息。
如果你想知道正在执行的Python代码,你可以在调试器中进入函数调用。或者只是阅读来源。像stdlib中的许多模块一样,smtplib
被设计成可用作示例代码以及实用模块,因此在文档顶部有一个指向smtplib.py
的链接。
有没有一种方法,我可以写输出到Tkinter的窗口或文件?
如果您查看上面链接的源代码,可以看到它只使用print
调用其调试日志记录。所以,这给你几个选择:
- 叉
smtplib
并取代那些print
通话更好的东西。
- Monkeypatch
smtplib
给它一个影响全球的函数print
函数。 (这只适用于Python 3.x;在2.x中,print
不是函数。)
- 打开一个文本文件,并且只分配
sys.stderr = my_text_file
。 (这仅适用于文件的作品,而不是Tkinter的,而且它还捕捉从smtplib
所有标准错误,而不仅仅是记录。)
- 创建一个类文件对象,做任何你想要在其
write
方法,并指定sys.stderr
到那。 (这适用于你想做的任何事情,包括添加到tkinter编辑窗口,但当然它仍然捕获所有stderr。)
- 从外部包装脚本 - 例如,使用包装脚本,使用
subprocess.Popen
来调用实际脚本并在管道中捕获其stderr
。
哪一个是合适的取决于您的需求。对于你的任务,假设在你做smtplib
的时候什么都没有写入stderr
,但是smtplib
的调试输出,我认为文件类对象的想法可能是有道理的。所以:
class MyDumbFakeStderr(object):
def write(self, output):
add_to_my_file_or_tkinter_thing(output)
sys.stderr = MyDumbFakeStderr()
try:
# your smtplib code here
finally:
sys.stderr = sys.__stderr__
显然恢复标准错误是不必要的,如果你只是将尽快就大功告成了退出,而如果你想这样做,反复你可能想将其包装在一个contextlib.contextmanager
,此外,这MyDumbFakeStderr
是非常愚蠢的(因此名称);它可以很好地包装代码,除了print
整行代码到stderr
,但对于任何更复杂的代码,您可能需要添加自己的行缓冲,或使其成为io.TextIOBase
等。这仅仅是一个让你开始的想法。
这是在[文件](https://开头的文档.python.org/32/library/smtplib.html#smtplib.SMTP.set_debuglevel):只需调用'SMTP.set_debuglevel(1)',你就可以得到“调试消息,用于连接以及发送到服务器和从服务器接收的所有消息“。 – abarnert 2014-09-02 18:07:23