日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python输出内容到终端的函数_如何通过Python函数运行的可执行文件的终端输出以一般方式静音?...

發(fā)布時間:2023/12/31 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python输出内容到终端的函数_如何通过Python函数运行的可执行文件的终端输出以一般方式静音?... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

我想抑制運行可執(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。