将第三方模块的标准输出重定向到/ dev / null

时间:2019-07-11 00:43:14

标签: python

假设这样的次要程序可以播放声音

#!/usr/bin/python3
from pydub import AudioSegment
from pydub.playback import play

bell_sound = AudioSegment.from_wav("/home/me/Music/audio/bell.wav")
play(bell_sound)

运行它后,终端会有多行支柱

In [8]: run report_time_example.py  
Input #0, wav, from '/tmp/tmpsc7u87_e.wav':   0KB sq=    0B f=0/0
  Duration: 00:00:01.62, bitrate: 176 kb/s
    Stream #0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 11025 Hz, 1 channels, s16, 176 kb/s
   1.43 M-A:  0.000 fd=   0 aq=    0KB vq=    0KB sq=    0B f=0/0

手动将输出重定向到/ dev / null

   !python report_time_example.py  &> /dev/null

如何在python代码体内完成这项工作。

1 个答案:

答案 0 :(得分:3)

The contextlib module为此提供了context managers to redirect stdoutstderr

import contextlib
import os

with open(os.devnull, 'w') as null, \
     contextlib.redirect_stdout(null), contextlib.redirect_stderr(null):
    bell_sound = AudioSegment.from_wav("/home/me/Music/audio/bell.wav")
    play(bell_sound)

with块中,stdoutstderr被重定向;退出该块后,将恢复原始句柄。

注意:redirect_stdout是在3.4中引入的,而redirect_stderr是在3.5中引入的;如果您仍使用2.7或类似版本,则唯一的选择是手动重新分配sys.stdout / sys.stderr,或使用os.dup2替换基础文件描述符,但是我建议您使用Modern首先使用Python。