python输出内容到终端的函数_如何通过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的终端输出,我不知道为什么.
解决方法:
您可以从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函数运行的可执行文件的终端输出以一般方式静音?...相关推荐
- python len函数_知识清单Python必备的69个函数,你掌握了吗?
本文纲要 Python 作为一门高级编程语言,为我们提供了许多方便易用的内置函数,节省了不少开发应用的时间.目前,Python 3.7 共有 69 个内置函数,一些是我们耳熟能详的函数,另一些却不是很 ...
- python入门之函数调用内置函数_第九篇 python基础之函数,递归,内置函数
阅读目录 一 数学定义的函数与python中的函数 二 为何使用函数 背景提要 三 函数和过程 四 函数参数 五 局部变量和全局变量 六 前向引用之'函数即变量' 七 嵌套函数和作用域 八 递归调用 ...
- matlab error函数_深度对比Python(Numpy,Scipy)与Matlab的数值精度
CSDN原文:https://blog.csdn.net/cauchy7203/article/details/107785295 Matlab一度被认为是最专业的数值计算工具之一,相信许多同学都或多 ...
- python zip函数_相当于Python的zip函数
下面是一个更时髦的ECMAScript 6版本:zip= rows=>rows[0].map((_,c)=>rows.map(row=>row[c])) 插图等价物到Python{z ...
- python命名规则数字开头的成语_浅谈Python中带_的变量或函数命名
搜索热词 Python 的代码风格由 PEP 8 描述.这个文档描述了 Python 编程风格的方方面面.在遵守这个文档的条件下,不同程序员编写的 Python 代码可以保持最大程度的相似风格.这样就 ...
- 用python处理excel数据做函数_如何使用python通过函数式编程完成excel中的数据处理及分析工作...
Excel是数据分析中最常用的工具,本篇文章通过python与excel的功能对比介绍如何使用python通过函数式编程完成excel中的数据处理及分析工作.在Python中pandas库用于数据处理 ...
- python match函数_什么是python re.match函数?(实例解析)
在这篇文章之中我们来了解一下关于python之中的正则表达式,有些朋友可能是刚刚接触到python这一编程语言,对于这一方面不是特别的了解,在接下来的文章之中我们来了解一下python中re.matc ...
- python中延时函数_详解python中实现延时回调普通函数
这篇文章主要给大家介绍了关于python中实现延时回调普通函数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧. 前言 ...
- python中怎么调用函数_浅谈Python中函数的定义及其调用方法
一.函数的定义及其应用 所谓函数,就是把具有独立功能的代码块组织成为一个小模块,在需要的时候调用函数的使用包含两个步骤 1.定义函数–封装独立的功能 2.调用函数–享受封装的成果 函数的作用:在开发时 ...
- python union函数_如何掌握Python union()方法及怎么用?
不断学习python的过程里,总能遇到各种形形色色的函数或者方法,本章给大家带来python union的用法,具体内容如下: union()方法 描述:union() 取并集,效果等同于 | ,重复 ...
最新文章
- 【复盘】端端,棒棒哒!
- 用requests获取网页源代码 python-手把手教你利用爬虫爬网页(Python代码)
- tensorflow object detection API训练公开数据集Oxford-IIIT Pets Dataset
- jsp button提交表单
- 实现物联网项目,你需要提前知道的6件事情
- 苹果11是高通基带吗_最强对抗!小米11对抗三星、苹果华为等最高旗舰|喜欢小米吗?...
- Pandas-DataFrame基础知识点总结
- 写给想要做自动化测试的人
- GdiPlus[15]: IGPLinearGradientBrush 之 GammaCorrection
- pypi 镜像使用帮助——临时使用镜像网站
- 《你的灯亮着吗》开始解决问题前,得先知道“真问题”是什么
- Libfetion在Ubuntu下的中文输出了局
- 计算机时钟周期的概念,指令周期、时钟周期、总线周期概念辨析
- 为什么在wps中调整了0.5倍行距,某一页的行数不会发生变化?
- json与xml的相互转换
- 使用Libxml2操作XML文档
- 亿邦国际拟增发融资:2020上半年营收降五成,仍存数亿元纠纷
- 物联网与射频识别技术,课程实验(一)
- python爬取学校题库_利用Python轻松爬取网页题库答案!教孩子不怕尴尬了!
- 高等代数_第3章线性方程组的解集的结构