Я разрабатываю систему на python, и одна из необходимых мне функций - это возможность вывода вывода консоли как на консоль, так и в указанный пользователем файл. Это репликация функции дневника в MATLAB. У меня есть следующее, которое отлично работает как в IDLE в Windows, так и в командной строке python в ubuntu (все это существует внутри загружаемого модуля):
class diaryout(object):
def __init__(self):
self.terminal = sys.stdout
self.save = None
def __del__(self):
try:
self.save.flush()
self.save.close()
except:
# do nothing, just catch the error; maybe it self was instantiated, but never opened
1/1
self.save = None
def dclose(self):
self.__del__()
def write(self, message):
self.terminal.write(message)
self.save.write(message)
def dopen(self,outfile):
self.outfile = outfile
try:
self.save = open(self.outfile, "a")
except Exception, e:
# just pass out the error here so the Diary function can handle it
raise e
def Diary(outfile = None):# NEW TO TEST
global this_diary
if outfile == None:
# None passed, so close the diary file if one is open
if isinstance(this_diary, diaryout):
sys.stdout = this_diary.terminal # set the stdout back to stdout
this_diary.dclose() # flush and close the file
this_diary = None # "delete" it
else:
# file passed, so let's open it and set it for the output
this_diary = diaryout() # instantiate
try:
this_diary.dopen(outfile) # open & test that it opened
except IOError:
raise IOError("Can't open %s for append!"%outfile)
this_dairy=none # must uninstantiate it, since already did that
except TypeError:
raise TypeError("Invalid input detected - must be string filename or None: %s"%Diary.__doc__)
this_dairy=none # must uninbstantiate it, since already did that
sys.stdout = this_diary # set stdout to it
Я использую ipython, намного лучше, чем IDLE и простой cmline python; в этом моя проблема. Я могу включить "дневник" отлично, без ошибок, но отображение на консоли портится. На прилагаемом снимке экрана показан этот . Выходной файл также становится искаженным. Когда я отменяю перенаправление с помощью Diary(None)
, все возвращается в норму. Я попытался отредактировать код, чтобы он даже не записывался в файл, безрезультатно. Кажется, будто что-то заставляет использовать неподдерживаемый набор символов или что-то, чего я не понимаю.
Кто-нибудь знает об этом?
%logstart
. - person Thomas K   schedule 19.10.2012