Подавить распечатку Python

Я встраиваю Python в приложение C ++ (используя Python C API) и хочу, чтобы исключения Python обрабатывались механизмом обработки исключений, который уже настроен в C ++. Этот механизм обработки исключений выведет само исключение, поэтому я не хочу, чтобы встроенный интерпретатор Python выводил его на экран. Могу ли я настроить встроенный интерпретатор Python, чтобы каким-то образом подавить вывод на консоль?

1

Решение

Вы можете подключить Stub-Streamhandler к обоим standard out а также standard error каналы в питоне.

Вот пример (включая повторное использование обоих каналов):

import sys
import cStringIO

print("Silencing stdout and stderr")
_stdout = sys.stdout
_stderr = sys.stderr
sys.stdout = cStringIO.StringIO()
sys.stderr = cStringIO.StringIO()

print("This should not be printed out")

sys.stdout = _stdout
sys.stderr = _stderr

print("Revoiced stdout and stderr")

Запуск этого образца должен привести к следующему выводу:

Silencing stdout and stderr
Revoiced stdout and stderr

[ОБНОВЛЕНО]

А вот вариант экономии памяти с отправкой на devnull:

import os, sys
with open(os.devnull, 'w') as devnull:
sys.stdout = devnull
sys.stderr = devnull
# ... here your code
4

Другие решения

Как вы выполнили код? Если исключение не перехватывается и не печатается напрямую с помощью python (кто-то непосредственно установил обработчик в python), для него будет задана обработка исключений, а затем исключение можно изучить с помощью C (see section Обработка исключений в справочном руководстве).

Если вы вызываете скрипт Python из C-кода, вызывающая функция вернет NULL или -1 (исключение произошло), и теперь вы можете использовать указанный выше API для чтения исключения (например, PyErr_Occurred (), …).

Но если все сделано самим кодом Python (если кто-то установил хук или что-то внутри его кода и напечатает его напрямую), у вас нет никаких изменений, чтобы легко поймать вещи. Может быть, вы можете добавить хук самостоятельно, вызывая ваш код. Это может быть сделано через sys.excepthook (тип, значение, traceback), и одним из решений будет найти позицию и удалить ее из кода или взглянуть на другие методы, чтобы обойти ее.

Этот сайт очень информативен: Python API / включить файлы

Редактировать:
Для перенаправления stdout или stderr вы можете использовать функцию C-Api:

FILE* sto = fopen("out.txt", "w+");
FILE* ste = fopen("outErr.txt", "w+");
PySys_SetObject("stdout", PyFile_FromFile(sto, "out.txt","wb", fclose));
PySys_SetObject("stderr", PyFile_FromFile(ste, "outErr.txt","wb", fclose));

перед вызовом любого другого кода Python. Я думаю, что PyFile_FromFile также может быть заменен чем-то другим, но я до сих пор не использовал это.

0