我在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中做到这一点。
非常感谢任何建议!
答案 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
产生所需的输出。