我需要禁用由某些 *.jar 文件生成的 sys.stderr 消息。
此 *.jar 文件由外部库(sklear2pmml库(的方法__init__.py
sklear2pmml
subprocess.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'))