batman
Сен. 18, 2006 08:04:32
Всем добрый день.
При отправке почты устанавливаю
s.set_debuglevel(1)
как мне правильно перенаправить вывод этой информации в файл?
стандартный поток вывода и ошибки перенаправляются, а отлдадочная информация нет.
-=<fantom>=-
Сен. 18, 2006 21:02:50
Для потока ошибок есть свой вывод. По умолчанию - это экран.
В самом начале надо указывать файл логов (перед открытием потока сообщений).
batman
Сен. 19, 2006 08:37:26
С ошибками всё понятно, там через RedirectStdio() всё отправляется в файл, а вот конкретно с отладочной информацией этого не происходит, она выводится по умолчанию на экран.
ofigetitelno
Сен. 19, 2006 16:15:18
:)
Смотрим, например, в smtplib.py.
Есть там примерно такие строки:
if self.debuglevel > 0: print>>stderr, ‘connect:’, (host, port)
Т.е. вывод идёт в stderr.
Делаем:
import sys
f = open('zzz.log', ‘a’) # собственно файл кудыть будет всё выводиться
sys.stderr = f
После этого весь stderr будет идти в файл.
batman
Сен. 19, 2006 17:05:50
Сам начинаю понимать, что похоже был не прав. set_debuglevel(1) все-таки выдаёт не отладочную информацию, а протокол обмена с сервером. Вот его и надо отловить.
batman
Сен. 20, 2006 09:09:10
Исходя из smtplib.py вывод действительно дожен перенаправлятся в stderr, но не перенаправляется. Не могу понять в чем проблемма… и совет от ofigetitelno не помогает. Может у кого ещё какие мысли есть по этому поводу?
ofigetitelno
Сен. 20, 2006 13:34:57
:)
Давай свой код, разберёмся…
batman
Сен. 20, 2006 13:48:41
# -*- coding: cp1251 -*-
#!/usr/bin/env python
import smtplib
from email.MIMEText import MIMEText
from email.mime.multipart import MIMEMultipart
import base64, cStringIO, email.Message
import wx, os, sys, time
class MailSendBox(wx.Frame):
def __init__(self,parent,id=-1,title='',pos = wx.Point(0,0),size = wx.Size(695,525),style = wx.DEFAULT_DIALOG_STYLE,name = ‘frame’):
pre=wx.PreFrame()
#…………………………………….#
self.initBefore()
def VwXinit(self):
self.SetIcon(wx.Icon(“images\py.ico”,wx.BITMAP_TYPE_ICO));
self.SetTitle('*********')
self.Show(True)
self.PanelFr = wx.Window(self,-1,wx.Point(-5,-5),wx.Size(710,510))
self.PanelFr.Bind(wx.EVT_SHOW,self.PanelFr_VwXEvOnShow)
#…………………………………….#
self.Refresh()
return
def initBefore(self):
f = open('123.log', ‘a’)
sys.stderr = f
return
def sndMail(self,event,s,CountMail,Cm):
#………………………………………….#
cte=“base64”
base64.encode(fp,contentsEncoded)
subMsg=email.Message.Message()
#…………………………………….#
contentsEncoded.close()
msgRoot.attach(subMsg)
#…………………………………….#
msgAlternative = MIMEMultipart('alternative')
msgRoot.attach(msgAlternative)
msgText = MIMEText(text)
msgAlternative.attach(msgText)
#………………………………………….#
s = smtplib.SMTP(opt.options,opt.options)
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#
s.set_debuglevel(1)
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#
s.sendmail(me, recipients, msgRoot.as_string())
s.close()
return
if __name__ == ‘__main__’:
app = wx.PySimpleApp()
frame = MailSendBox(parent=None, id=-1)
tm = time.asctime()
frame.Show()
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#
app.RedirectStdio(“MailLog.log”)
#!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!#
print “****************************************************************”#+“\n”
print “#”+“ ”+tm#+“ \n”
print “****************************************************************”#+“\n”
app.MainLoop()
ofigetitelno
Сен. 20, 2006 14:15:47
Для начала сделай:
app = wx.PySimpleApp(redirect=1, filename='MailLog.log')
т.е. не нужно вызывать app.RedirectStdio отдельно, инициализация этой фигни в конструкторе.
И соответственно самому дальше перехватывать stderr не нужно.
batman
Сен. 20, 2006 14:31:12
Спасибо, пробую… Завтра отпишусь…