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的终端输出,我不知道为什么.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值