如何仅重定向部分流?

时间:2016-09-09 01:35:41

标签: python linux bash file-descriptor io-redirection

我在Linux上使用bash进行bash。我希望能够抑制来自特定模块的错误消息,但保留其他错误消息。一个例子可能是传达我想要的最有效方式:

档案:module.py

import sys
sys.stderr.write('Undesired output.\n')

档案:script.py

import module
import sys

sys.stderr.write('Desired output.\n')
sys.stdout.write('Desired output.\n')
x = int('a')

正在运行script.py的输出:

$ python script.py
Undesired output.
Desired output.
Desired output.
Traceback (most recent call last):
  File "script.py", line 6, in <module>
    x = int('a')
ValueError: invalid literal for int() with base 10: 'a'

运行script.py的所需输出:

$ python script.py
Desired output.
Desired output.
Traceback (most recent call last):
  File "script.py", line 6, in <module>
    x = int('a')
ValueError: invalid literal for int() with base 10: 'a'

我无法修改module.py,但我必须使用它。我已经尝试了各种重定向,并打开了新的文件描述符,但我似乎无法在python中更改调用shell的文件描述符,所以

$ python script.py 2>/dev/null
Desired output.

杀死所有stderr输出。由于我知道该模块导致了不需要的消息,因此我确切地知道我想要将stderr重定向到/dev/null并开始将其重定向到&1,但我可以&#39;似乎能够在Python中做到这一点。

非常感谢任何建议!

2 个答案:

答案 0 :(得分:1)

在接受的答案中有一个例子可以帮助你

Temporarily Redirect stdout/stderr

但在你的情况下,它假定你可以做

import module

后的

import sys
在之后

你已经在你的Python代码中重定向了stderr。像

import sys

... redirect code here

import module

... code to remove redirect

除了重定向之外,不知道这是否会破坏您所需的功能。

此外,您不应该在代码中间粘贴import语句,因为它违反了PEP8样式指南。

答案 1 :(得分:1)

akubot's answer和一些实验让我得到了这个问题的答案,所以我会接受它。

这样做:

$ exec 3>&1

然后将script.py更改为以下内容:

import sys, os
sys.stderr = open(os.devnull, 'w')
import module
sys.stderr = os.fdopen(3, 'w')

sys.stderr.write('Desired output.\n')
sys.stdout.write('Desired output.\n')
x = int('a')

然后像这样跑:

$ python script.py 2>/dev/null

产生所需的输出。