我需要禁用某些* .jar文件生成的sys.stderr消息。
此* .jar文件由subprocess.check_call(cmd)
来自外部库{strong}的sklear2pmml
方法__init__.py
( sklear2pmml 库)调用。
我知道,我可以通过将库代码更改为以下内容来禁用stderr:
fnull = open(os.devnull,'w')
subprocess.check_call(cmd,stderr=fnull)
但是这个蠢货导致改变python库,我不想要。如何在没有这种副作用的情况下修复stderr输出?
答案 0 :(得分:2)
一种选择可能是暂时重定向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'))