我想抑制运行可执行文件的函数产生的所有终端输出.

我试图通过使用每次调用函数时临时重新定义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的终端输出,我不知道为什么.

解决方法:

您可以从PyAudio切换到sounddevice模块,该模块已经负责消除终端输出(参见#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)

更新:

上面的上下文管理器使标准错误输出(stderr)静音,该输出用于原始问题中提到的来自PortAudio的恼人消息.要删除标准输出(stdout),就像在更新的问题中一样,你必须用sys.stdout替换sys.stderr,用数字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)

标签:python,console,silent,executable,pyaudio

来源: https://codeday.me/bug/20190923/1814318.html

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

  1. python len函数_知识清单Python必备的69个函数,你掌握了吗?

    本文纲要 Python 作为一门高级编程语言,为我们提供了许多方便易用的内置函数,节省了不少开发应用的时间.目前,Python 3.7 共有 69 个内置函数,一些是我们耳熟能详的函数,另一些却不是很 ...

  2. python入门之函数调用内置函数_第九篇 python基础之函数,递归,内置函数

    阅读目录 一 数学定义的函数与python中的函数 二 为何使用函数 背景提要 三 函数和过程 四 函数参数 五 局部变量和全局变量 六 前向引用之'函数即变量' 七 嵌套函数和作用域 八 递归调用 ...

  3. matlab error函数_深度对比Python(Numpy,Scipy)与Matlab的数值精度

    CSDN原文:https://blog.csdn.net/cauchy7203/article/details/107785295 Matlab一度被认为是最专业的数值计算工具之一,相信许多同学都或多 ...

  4. python zip函数_相当于Python的zip函数

    下面是一个更时髦的ECMAScript 6版本:zip= rows=>rows[0].map((_,c)=>rows.map(row=>row[c])) 插图等价物到Python{z ...

  5. python命名规则数字开头的成语_浅谈Python中带_的变量或函数命名

    搜索热词 Python 的代码风格由 PEP 8 描述.这个文档描述了 Python 编程风格的方方面面.在遵守这个文档的条件下,不同程序员编写的 Python 代码可以保持最大程度的相似风格.这样就 ...

  6. 用python处理excel数据做函数_如何使用python通过函数式编程完成excel中的数据处理及分析工作...

    Excel是数据分析中最常用的工具,本篇文章通过python与excel的功能对比介绍如何使用python通过函数式编程完成excel中的数据处理及分析工作.在Python中pandas库用于数据处理 ...

  7. python match函数_什么是python re.match函数?(实例解析)

    在这篇文章之中我们来了解一下关于python之中的正则表达式,有些朋友可能是刚刚接触到python这一编程语言,对于这一方面不是特别的了解,在接下来的文章之中我们来了解一下python中re.matc ...

  8. python中延时函数_详解python中实现延时回调普通函数

    这篇文章主要给大家介绍了关于python中实现延时回调普通函数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧. 前言 ...

  9. python中怎么调用函数_浅谈Python中函数的定义及其调用方法

    一.函数的定义及其应用 所谓函数,就是把具有独立功能的代码块组织成为一个小模块,在需要的时候调用函数的使用包含两个步骤 1.定义函数–封装独立的功能 2.调用函数–享受封装的成果 函数的作用:在开发时 ...

  10. python union函数_如何掌握Python union()方法及怎么用?

    不断学习python的过程里,总能遇到各种形形色色的函数或者方法,本章给大家带来python union的用法,具体内容如下: union()方法 描述:union() 取并集,效果等同于 | ,重复 ...

最新文章

  1. 【复盘】端端,棒棒哒!
  2. 用requests获取网页源代码 python-手把手教你利用爬虫爬网页(Python代码)
  3. tensorflow object detection API训练公开数据集Oxford-IIIT Pets Dataset
  4. jsp button提交表单
  5. 实现物联网项目,你需要提前知道的6件事情
  6. 苹果11是高通基带吗_最强对抗!小米11对抗三星、苹果华为等最高旗舰|喜欢小米吗?...
  7. Pandas-DataFrame基础知识点总结
  8. 写给想要做自动化测试的人
  9. GdiPlus[15]: IGPLinearGradientBrush 之 GammaCorrection
  10. pypi 镜像使用帮助——临时使用镜像网站
  11. 《你的灯亮着吗》开始解决问题前,得先知道“真问题”是什么
  12. Libfetion在Ubuntu下的中文输出了局
  13. 计算机时钟周期的概念,指令周期、时钟周期、总线周期概念辨析
  14. 为什么在wps中调整了0.5倍行距,某一页的行数不会发生变化?
  15. json与xml的相互转换
  16. 使用Libxml2操作XML文档
  17. 亿邦国际拟增发融资:2020上半年营收降五成,仍存数亿元纠纷
  18. 物联网与射频识别技术,课程实验(一)
  19. python爬取学校题库_利用Python轻松爬取网页题库答案!教孩子不怕尴尬了!
  20. 高等代数_第3章线性方程组的解集的结构

热门文章

  1. 09.html使用iframe、embed查看pdf不显示(未解决),使用pdf.js预览pdf
  2. python进阶太难_Python进阶
  3. EndnoteX9下载并安装
  4. Python实现鼠标自动在屏幕上随机移动
  5. Python错误和异常
  6. 基于AIML2.0写一个机器人
  7. labelme标注的json文件转换成png格式
  8. SM3密码杂凑算法实现及说明
  9. 【计量经济学导论】08. 平稳时间序列
  10. IOS之OC语言简介