2024-06-01 07:10:30 发布
网友
我在使用机器学习库PyML时遇到了一个恼人的问题。PyML使用libsvm训练SVM分类器。问题是libsvm将一些文本输出到标准输出。但是因为它在Python之外,所以我无法截获它。我尝试使用问题Silence the stdout of a function in Python without trashing sys.stdout and restoring each function call中描述的方法,但这些方法都没有帮助。在
有什么办法吗。修改PyML不是一个选项。在
打开/dev/null进行写入,使用os.dup()复制stdout,使用os.dup2()将Open/dev/null复制到stdout。使用os.dup2()将复制的stdout复制回真实的stdout。在
/dev/null
os.dup()
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)
我也遇到了同样的问题,就这样解决了:
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中的函数包围起来,如下所示:
对于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
打开
/dev/null
进行写入,使用os.dup()
复制stdout,使用os.dup2()
将Open/dev/null
复制到stdout。使用os.dup2()
将复制的stdout复制回真实的stdout。在我也遇到了同样的问题,就这样解决了:
戴夫·史密斯在他的blog上给出了一个很好的答案。基本上,它很好地包装了Ignacio的答案:
现在,您可以将任何将不需要的噪声杂散到stdout中的函数包围起来,如下所示:
^{pr2}$对于Python 3,可以使用:
相关问题 更多 >
编程相关推荐