У меня есть скрипт Python, который использует некоторые функции Python с закрытым ящиком (т. Е. Я не могу редактировать эти функции), предоставленные моим работодателем. Когда я вызываю эти функции, они выводят вывод на мой терминал linux, который я хотел бы подавить. Я попытался перенаправить stdout/stderr через;Подавить stdout/stderr print из функций Python
orig_out = sys.stdout
sys.stdout = StringIO()
rogue_function()
sys.stdout = orig_out
, но это не позволяет получить выход. Я думаю, что функции, которые я вызываю через Python (rogue_function() сверху), действительно являются обертками для скомпилированного C-кода, который фактически выполняет печать.
Кто-нибудь знает, как я могу сделать «глубокий захват» любой печати, переданной в stdout/stderr с помощью функции (и любых подфункций, которые выполняют вызовы)?
UPDATE:
я в конечном итоге принимает метод, описанный в выбранном ответ ниже и писать менеджер контекста подавить стандартный вывод и стандартный поток ошибок:
# Define a context manager to suppress stdout and stderr.
class suppress_stdout_stderr(object):
'''
A context manager for doing a "deep suppression" of stdout and stderr in
Python, i.e. will suppress all print, even if the print originates in a
compiled C/Fortran sub-function.
This will not suppress raised exceptions, since exceptions are printed
to stderr just before a script exits, and after the context manager has
exited (at least, I think that is why it lets exceptions through).
'''
def __init__(self):
# Open a pair of null files
self.null_fds = [os.open(os.devnull,os.O_RDWR) for x in range(2)]
# Save the actual stdout (1) and stderr (2) file descriptors.
self.save_fds = [os.dup(1), os.dup(2)]
def __enter__(self):
# Assign the null pointers to stdout and stderr.
os.dup2(self.null_fds[0],1)
os.dup2(self.null_fds[1],2)
def __exit__(self, *_):
# Re-assign the real stdout/stderr back to (1) and (2)
os.dup2(self.save_fds[0],1)
os.dup2(self.save_fds[1],2)
# Close all file descriptors
for fd in self.null_fds + self.save_fds:
os.close(fd)
Чтобы использовать это просто:
with suppress_stdout_stderr():
rogue_function()
Это работает «довольно хорошо». Он подавляет распечатку от функций изгоев, которые загромождали мой скрипт. Я заметил в тестировании, что он позволяет через поднятые исключения, а также некоторые логгер печати, и я не совсем понимаю, почему. Я думаю, что это имеет какое-то отношение к , когда эти сообщения отправляются в stdout/stderr (я думаю, что это происходит после выхода моего контекстного менеджера). Если кто-нибудь может подтвердить это, мне было бы интересно услышать подробности ...
Does [Этот подход] (http://stackoverflow.com/a/978264/344821) (от связанная боковая панель)? – Dougal
Вместо установки 'sys.stdout' в' StringIO() ', попробовали ли вы установить его в файл? то есть 'sys.stdout = open ('log.txt', 'w')' – carmenism
Dougal, спасибо, это выглядит многообещающе, я попробую его завтра. nullpointer, я попробовал перенаправить его в класс NullPointer(), и это тоже не сработало. – jeremiahbuddha