Захват вывода программы: за пределами наивных решений
При написании сценариев Python захват вывода программы для дальнейшей обработки является общей необходимостью. Хотя наивные решения могут показаться простыми, они часто терпят неудачу. Рассмотрим следующий скрипт, записывающий в стандартный вывод:
# writer.py import sys def write(): sys.stdout.write("foobar")
Попытка записать выходные данные с помощью следующего кода завершается неудачей:
# mymodule.py from writer import write out = write() print(out.upper())
Для эффективного захвата вывода требуется более надежное решение. Один из подходов предполагает изменение системного потока stdout:
import sys from cStringIO import StringIO # Redirect stdout to a StringIO object backup = sys.stdout sys.stdout = StringIO() # Perform the write operation write() # Retrieve and restore stdout out = sys.stdout.getvalue() sys.stdout.close() sys.stdout = backup # Process the captured output print(out.upper())
Контекстный менеджер для Python 3.4 :
Для Python 3.4 и более поздних версий доступно более простое и краткое решение с использованием contextlib. Менеджер контекста redirect_stdout:
from contextlib import redirect_stdout import io f = io.StringIO() # Redirect stdout to f using the context manager with redirect_stdout(f): help(pow) # Retrieve captured output from f s = f.getvalue()
Этот элегантный подход упрощает процесс захвата выходных данных, упрощая его обработку в ваших скриптах Python.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3