Я создал менеджер контекста python, который захватывает все выходные данные sys.stdout, например, с помощью print (), и записывает их в файл.
Проблема в том, что я не могу заставить это работать как для Python 2.7, так и для 3.6.
Менеджер контекста внутренне использует
self.file_writer = open(self.log_file, 'w', encoding='utf8')
но когда я запускаю его в Python 2.7, тогда
print(u"a test string")
приводит к сообщению об ошибке:
write() argument 1 must be unicode, not str
Даже если строка явно в кодировке Unicode.
Если я изменю файл на
self.file_writer = open(self.log_file, 'wb')
тогда это работает в Python 2.7, но не в 3.6.
Что мне нужно сделать, чтобы заставить его работать на любой версии Python?
Ниже приводится выписка менеджера:
PATH_PREFIX = "some/path/"
class manager:
def __init__(self):
self.log_file = os.path.join(PATH_PREFIX, 'log.txt')
def __enter__(self):
# create a file for logging
self.log_file_stream = open(self.log_file, 'w', encoding='utf8')
self.log_file_stream.__enter__()
# redirect stdout to this file
self.previous_stdout = sys.stdout
sys.stdout = self.log_file_stream
return self
def __exit__(self, etype, value, exception_traceback):
# stop redirecting stdout to the log file
sys.stdout = self.previous_stdout
# close the log file
self.log_file_stream.__exit__()