连云港网站搜索优化,禹州网站建设,Wordpress收费下载会员,怎么把自己写的网页生成网址我想抑制运行可执行文件的函数产生的所有终端输出.
我试图通过使用每次调用函数时临时重新定义stdout和stderr的上下文管理器来抑制Python函数的输出.这会抑制函数中的print调用产生的终端输出,但是当函数调用产生终端输出的可执行文件时,它似乎不起作用.
那么,如何抑制Python函…我想抑制运行可执行文件的函数产生的所有终端输出.
我试图通过使用每次调用函数时临时重新定义stdout和stderr的上下文管理器来抑制Python函数的输出.这会抑制函数中的print调用产生的终端输出,但是当函数调用产生终端输出的可执行文件时,它似乎不起作用.
那么,如何抑制Python函数调用的可执行文件的输出
我的代码如下.我已经包含了一个示例函数,它调用ls来试图说明我想要抑制的终端输出的类型(虽然我正在处理的函数是不同的).
#!/usr/bin/env python
import os
import subprocess
import sys
def main():
print(hello)
with silence():
print(there)
print(world)
with silence():
engage_command(command ls)
class silence(object):
def __init__(
self,
stdout None,
stderr None
):
if stdout None and stderr None:
devnull open(os.devnull, w)
stdout devnull
stderr devnull
self._stdout stdout or sys.stdout
self._stderr stderr or sys.stderr
def __enter__(
self
):
self.old_stdout sys.stdout
self.old_stderr sys.stderr
self.old_stdout.flush()
self.old_stderr.flush()
sys.stdout self._stdout
sys.stderr self._stderr
def __exit__(
self,
exc_type,
exc_value,
traceback
):
self._stdout.flush()
self._stderr.flush()
sys.stdout self.old_stdout
sys.stderr self.old_stderr
def engage_command(
command None
):
process subprocess.Popen(
[command],
shell True,
executable /bin/bash)
process.wait()
output, errors process.communicate()
return output
if __name__ __main__:
main()
在我的特定情况下,我正在尝试运行以下函数(而不是上面的ls函数)
with propyte.silence():
stream pyaudio.PyAudio().open(
format pyaudio.PyAudio().get_format_from_width(1),
channels 1,
rate bitrate,
output True
)
运行时,会产生如下输出
ALSA lib pcm_dsnoop.c:606:(snd_pcm_dsnoop_open) unable to open slave
ALSA lib pcm_dmix.c:1029:(snd_pcm_dmix_open) unable to open slave
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2266:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
ALSA lib pcm_dmix.c:1029:(snd_pcm_dmix_open) unable to open slave
Cannot connect to server socket err No such file or directory
Cannot connect to server request channel
jack server is not running or cannot be started
JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for 4294967295, skipping unlock
JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for 4294967295, skipping unlock
我想压制那个输出.
编辑测试Matthias提供的a solution
#!/usr/bin/env python
import contextlib
import os
import subprocess
import sys
def main():
print(hello)
with silence():
print(there)
print(world)
with silence():
engage_command(command ls)
contextlib.contextmanager
def silence():
devnull os.open(os.devnull, os.O_WRONLY)
old_stderr os.dup(2)
sys.stderr.flush()
os.dup2(devnull, 2)
os.close(devnull)
try:
yield
finally:
os.dup2(old_stderr, 2)
os.close(old_stderr)
def engage_command(
command None
):
process subprocess.Popen(
[command],
shell True,
executable /bin/bash)
process.wait()
output, errors process.communicate()
return output
if __name__ __main__:
main()
我没有成功地抑制打印或ls的终端输出,我不知道为什么.