python输出内容到终端的函数_如何通过Python函数运行的可执行文件的终端输出以一般方式静音?...
我想抑制運行可執(zhí)行文件的函數(shù)產(chǎn)生的所有終端輸出.
我試圖通過使用每次調(diào)用函數(shù)時臨時重新定義stdout和stderr的上下文管理器來抑制Python函數(shù)的輸出.這會抑制函數(shù)中的print調(diào)用產(chǎn)生的終端輸出,但是當(dāng)函數(shù)調(diào)用產(chǎn)生終端輸出的可執(zhí)行文件時,它似乎不起作用.
那么,如何抑制Python函數(shù)調(diào)用的可執(zhí)行文件的輸出?
我的代碼如下.我已經(jīng)包含了一個示例函數(shù),它調(diào)用ls來試圖說明我想要抑制的終端輸出的類型(雖然我正在處理的函數(shù)是不同的).
#!/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()
在我的特定情況下,我正在嘗試運行以下函數(shù)(而不是上面的ls函數(shù)):
with propyte.silence():
stream = pyaudio.PyAudio().open(
format = pyaudio.PyAudio().get_format_from_width(1),
channels = 1,
rate = bitrate,
output = True
)
運行時,會產(chǎn)生如下輸出:
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的終端輸出,我不知道為什么.
解決方法:
您可以從PyAudio切換到sounddevice模塊,該模塊已經(jīng)負(fù)責(zé)消除終端輸出(參見#12).這是在那里完成的(使用CFFI):
from cffi import FFI
import os
ffi = FFI()
ffi.cdef("""
/* from stdio.h */
FILE* fopen(const char* path, const char* mode);
int fclose(FILE* fp);
FILE* stderr; /* GNU C library */
FILE* __stderrp; /* Mac OS X */
""")
try:
stdio = ffi.dlopen(None)
devnull = stdio.fopen(os.devnull.encode(), b'w')
except OSError:
return
try:
stdio.stderr = devnull
except KeyError:
try:
stdio.__stderrp = devnull
except KeyError:
stdio.fclose(devnull)
如果您需要純Python解決方案,可以嘗試使用此上下文管理器:
import contextlib
import os
import sys
@contextlib.contextmanager
def ignore_stderr():
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)
更新:
上面的上下文管理器使標(biāo)準(zhǔn)錯誤輸出(stderr)靜音,該輸出用于原始問題中提到的來自PortAudio的惱人消息.要刪除標(biāo)準(zhǔn)輸出(stdout),就像在更新的問題中一樣,你必須用sys.stdout替換sys.stderr,用數(shù)字1替換文件描述符2:
@contextlib.contextmanager
def ignore_stdout():
devnull = os.open(os.devnull, os.O_WRONLY)
old_stdout = os.dup(1)
sys.stdout.flush()
os.dup2(devnull, 1)
os.close(devnull)
try:
yield
finally:
os.dup2(old_stdout, 1)
os.close(old_stdout)
標(biāo)簽:python,console,silent,executable,pyaudio
來源: https://codeday.me/bug/20190923/1814318.html
總結(jié)
以上是生活随笔為你收集整理的python输出内容到终端的函数_如何通过Python函数运行的可执行文件的终端输出以一般方式静音?...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Jeecg框架简介
- 下一篇: 用Python筛选国考职位表