抑制库外模块调用的输出

2024-06-01 07:10:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我在使用机器学习库PyML时遇到了一个恼人的问题。PyML使用libsvm训练SVM分类器。问题是libsvm将一些文本输出到标准输出。但是因为它在Python之外,所以我无法截获它。我尝试使用问题Silence the stdout of a function in Python without trashing sys.stdout and restoring each function call中描述的方法,但这些方法都没有帮助。在

有什么办法吗。修改PyML不是一个选项。在


Tags: ofthe方法in文本机器标准分类器
3条回答

打开/dev/null进行写入,使用os.dup()复制stdout,使用os.dup2()将Open/dev/null复制到stdout。使用os.dup2()将复制的stdout复制回真实的stdout。在

devnull = open('/dev/null', 'w')
oldstdout_fno = os.dup(sys.stdout.fileno())
os.dup2(devnull.fileno(), 1)
makesomenoise()
os.dup2(oldstdout_fno, 1)

我也遇到了同样的问题,就这样解决了:

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

戴夫·史密斯在他的blog上给出了一个很好的答案。基本上,它很好地包装了Ignacio的答案:

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中的函数包围起来,如下所示:

^{pr2}$

对于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

相关问题 更多 >