Подавление вывода вызова модуля вне библиотеки - PullRequest
6 голосов
/ 14 ноября 2010

У меня раздражающая проблема при использовании библиотеки машинного обучения PyML . PyML использует libsvm для обучения классификатора SVM. Проблема в том, что libsvm выводит некоторый текст на стандартный вывод. Но поскольку это за пределами Python, я не могу его перехватить. Я попытался использовать методы, описанные в задаче Отключить вывод функции в Python без перебора sys.stdout и восстановления каждого вызова функции , но ни одна из них не помогла.

Есть ли способ сделать это? Модификация PyML не возможна.

Ответы [ 3 ]

8 голосов
/ 14 ноября 2010

Открыть /dev/null для записи, используйте os.dup(), чтобы скопировать стандартный вывод, и os.dup2(), чтобы скопировать ваш открытый /dev/null в стандартный вывод.Используйте os.dup2(), чтобы скопировать скопированный стандартный вывод обратно в настоящий стандартный вывод после.

devnull = open('/dev/null', 'w')
oldstdout_fno = os.dup(sys.stdout.fileno())
os.dup2(devnull.fileno(), 1)
makesomenoise()
os.dup2(oldstdout_fno, 1)
2 голосов
/ 11 января 2018

Дейв Смит дал прекрасный ответ на этот вопрос в своем блоге . По сути, это красиво оборачивает ответ Игнасио:

def suppress_stdout():
    with open(os.devnull, "w") as devnull:
        old_stdout = sys.stdout
        sys.stdout = devnull
        try:  
            yield
        finally:
            sys.stdout = old_stdout

Теперь вы можете окружить любую функцию, которая искажает нежелательный шум, в stdout следующим образом:

print "You can see this"
with suppress_stdout():
    print "You cannot see this"
print "And you can see this again"

Для Python 3 вы можете использовать:

from contextlib import contextmanager
import os
import sys

@contextmanager
def suppress_stdout():
    with open(os.devnull, "w") as devnull:
        old_stdout = sys.stdout
        sys.stdout = devnull
        try:  
            yield
        finally:
            sys.stdout = old_stdout
0 голосов
/ 23 февраля 2011

У меня была такая же проблема, и я исправил ее так:

from cStringIO import StringIO

def wrapped_svm_predict(*args):
    """Run :func:`svm_predict` with no *stdout* output."""
    so, sys.stdout = sys.stdout, StringIO()
    ret = svm_predict(*args)
    sys.stdout = so
    return ret
...