Внешняя библиотека использует печать вместо возврата

1

У меня проблема с внешней библиотекой, которую я использую в своем скрипте.

Я выполняю функцию из этой библиотеки, но функция выводит результат напрямую. Однако мне нужен вывод, чтобы проверить, есть ли в нем определенная строка.

Как я могу гарантировать, что вывод функции во внешней библиотеке входит в переменную, чтобы я мог выполнять сравнения со строкой?

  • 5
    Насколько вы связаны с этой внешней библиотекой? Звучит довольно плохо. Есть ли способы, которыми вы можете получить доступ к значению более прямо?
  • 0
    Этот ответ помог мне с подобной проблемой в прошлом: stackoverflow.com/a/16571630/6321559
Теги:

2 ответа

1

Если у вас действительно нет другого выбора, вы можете перенаправить 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

Однако было бы намного проще модифицировать библиотеку.

0

Вы можете временно обменять 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)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню