Вместо установки sys.stdout
в качестве параметра по умолчанию попробуйте:
def print(self, file=None):
if not file is None:
sys.stdout = open(file)
и оставьте остальной код таким же.Установка sys.stdout в качестве объекта файла приведет к тому, что печать закончится там вместо обычного stdout.Имейте в виду, что использование open вне блока with обычно не рекомендуется, поэтому вы можете реструктурировать вещи соответствующим образом.
EDIT: две вещи: 1. Я сделал небольшую демонстрацию, чтобы показать, что происходит, когда вы устанавливаетеsys.stdout для файлового объекта:
In [1]: import sys
In [2]: print('some BODY once told me')
some BODY once told me
In [3]: sys.stdout = open('test.txt','w')
In [4]: print('some BODY once told me')
In [5]: sys.stdout = sys.__stdout__
In [6]: with open('test.txt','r') as f:
...: print(f.read())
...:
some BODY once told me
Как видите, без изменений sys.stdout
печать возвращается в консоли ipython.После изменения его в файл с именем text.txt он заканчивается там и проверяется путем помещения sys.stdout
обратно в оригинал, который задается sys.__stdout__
, и распечатывания содержимого файла.
Возможно, вам не нужно беспокоиться об использовании блока with.Попытка закрыть sys.stdout после установки его равным объекту файла вызвала ошибку:
Traceback (последний вызов был последним): файл "/ home / finchj / Programs / anaconda3 / envs / finchj/ bin / ipython ", строка 11, в файле sys.exit (start_ipython ())" /home/finchj/programs/anaconda3/envs/finchj/lib/python3.6/site-packages/IPython/init .py ", строка 125, в start_ipython возвращает файл launch_new_instance (argv = argv, ** kwargs) Файл" /home/finchj/programs/anaconda3/envs/finchj/lib/python3.6/site-packages/traitlets/config/application.py ", строка 658, в файле launch_instance app.start ()" /home/finchj/programs/anaconda3/envs/finchj/lib/python3.6/site-packages/IPython/terminal/ipapp.py ",строка 356, в стартовом файле self.shell.mainloop () файл "/home/finchj/programs/anaconda3/envs/finchj/lib/python3.6/site-packages/IPython/terminal/interactiveshell.py", строка 498, вmainloop self.interact () Файл "/home/finchj/programs/anaconda3/envs/finchj/lib/python3.6/site-packages/IPython/terminal/interactiveshell.py", line 478, в интерактивной печати (self.separate_in, end = '') ValueError: операция ввода-вывода для закрытого файла.
Приводит меня к подозрению, что очистка выполняется негласно, хотя я не могу подтвердить, что этодело в это время.