从外部库禁用stderr

时间:2017-07-24 14:28:08

标签: python subprocess stderr

我需要禁用某些* .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输出?

1 个答案:

答案 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'))