У меня проблема с внешней библиотекой, которую я использую в своем скрипте.
Я выполняю функцию из этой библиотеки, но функция выводит результат напрямую. Однако мне нужен вывод, чтобы проверить, есть ли в нем определенная строка.
Как я могу гарантировать, что вывод функции во внешней библиотеке входит в переменную, чтобы я мог выполнять сравнения со строкой?
Если у вас действительно нет другого выбора, вы можете перенаправить stdout
при вызове библиотеки. Вот фрагмент кода, адаптированный из этого ответа:
def some_library():
print("Should probably return instead of print.")
import sys
from io import StringIO
class redirected_stdout:
def __init__(self):
self._stdout = None
self._string_io = None
def __enter__(self):
self._stdout = sys.stdout
sys.stdout = self._string_io = StringIO()
return self
def __exit__(self, type, value, traceback):
sys.stdout = self._stdout
@property
def string(self):
return self._string_io.getvalue()
with redirected_stdout() as out:
some_library()
result = out.string
print("return" in result)
# True
Однако было бы намного проще модифицировать библиотеку.
Вы можете временно обменять sys.stdout с вашим буфером, а затем проверить буфер.
def external_method():
print ("print something out, don't return")
class MyBuffer(object):
def __init__(self):
self.buffer = []
def write(self, *args, **kwargs):
self.buffer.append(args)
import sys
old_stdout = sys.stdout
sys.stdout = MyBuffer()
external_method()
my_buffer, sys.stdout = sys.stdout, old_stdout
print (my_buffer.buffer)