Я написал несколько unittests, которые анализируют данные, которые регистрируются со стандартной функцией регистрации python. Используя некоторые из идей, которые я нашел здесь: Capture stdout from a script in Python о том, как захватить данные из stderr, я придумал следующий скрипт, который я упростил до минимума, чтобы проиллюстрировать проблему, с которой я столкнулся. (Ниже петля моделирует тот факт, что эта функция может быть вызвана различным UnitTests)Python StringIO неправильно отображает данные из stderr
import logging, sys
from StringIO import StringIO
def get_stderr():
saved_stderr = sys.stderr
stderr_string_io = StringIO()
sys.stderr = stderr_string_io
try:
logging.error("Foobar!!!")
finally:
# set the stdout and stderr back to their original values
sys.stderr = saved_stderr
err_output = stderr_string_io.getvalue()
return err_output
for x in [1, 2]:
err_output = get_stderr()
print "Run %d: %s" % (x, err_output)
Если вы запустите скрипт, даст следующий результат, в котором выход каротажа из второй итерации цикла будет полностью потерян :
Run 1: ERROR:root:Foobar!!!
Run 2:
Process finished with exit code 0
Хотя я бы ожидать, что это даст следующий результат:
Run 1: ERROR:root:Foobar!!!
Run 2: ERROR:root:Foobar!!!
Process finished with exit code 0
Примечание: что выполнение stderr_string_io.close()
в конце е unction не работает, так как скрипт затем выдает ValueError
при следующей функции.
Почему этот код не ведет себя так, как ожидалось, и каково решение этой проблемы?
Это странное поведение. Если вы помещаете 'logging.error (" practicing ")' в верхнюю часть файла, все работает ... но игнорирует замену 'stderr'. – Veedrac
Да, это очень странно! –