从外部库禁用标准



我需要禁用由某些 *.jar 文件生成的 sys.stderr 消息。

此 *.jar 文件由外部库(sklear2pmml库(的方法__init__.pysklear2pmmlsubprocess.check_call(cmd)调用。

我知道,我可以通过将库代码更改为以下内容来禁用 stdrr:

fnull = open(os.devnull,'w')
subprocess.check_call(cmd,stderr=fnull) 

但是这个 treak 会导致 python 库的变化,这是我不想要的。如何在没有这种副作用的情况下修复 stderr 输出?

一种选择可能是暂时重定向sys.stderr,如下所示:

old_stderr = sys.stderr
sys.stderr = open(os.devnull, "w")
# put your library call here
sys.stderr = old_stderr

这是假设你没有给图书馆打电话太多次——我认为这可能是一件非常昂贵的事情。

编辑(原始答案是错误的(:

这实际上有点深 - Python的重定向不会影响进程的STDERR文件描述符。您需要关闭并重新打开进程的文件描述符。这在以下博客文章中进行了描述,该博客文章还提供了一个实现(用于 STDOUT(:

http://eli.thegreenplace.net/2015/redirecting-all-kinds-of-stdout-in-python/

我不得不稍微更改博客中的代码以使其适用于我的 Python 版本,我正在添加受影响的行:

# Create a new sys.stdout that points to the redirected fd
import codecs
sys.stdout = codecs.getreader("utf-8")(os.fdopen(original_stdout_fd, 'wb'))

相关内容

  • 没有找到相关文章

最新更新