如何防止os.popen返回输出?

时间:2019-06-24 21:18:27

标签: python

我正在通过os.popen向cmd编写命令,但是此命令的结果是无用的“垃圾”,我对此不感兴趣。我只需要运行该命令,就不希望任何东西退回。

PS:接受使用os.system或子流程模块的任何其他解决方案。但是请记住,该命令将使该cmd终端永远处于繁忙状态,这是无尽的。我只想从我的主程序中运行它,然后转到其他内容,而不是等待输出,而且我不想一开始就看到输出。

编辑:人们要求输入实际代码:

os.popen(f'tensorboard --logdir="{path + logdir}" --host localhost --port {pn}', 'w')

3 个答案:

答案 0 :(得分:1)

import subprocess

def runCmd(cmd):
    p = subprocess.Popen(cmd, stdout=subprocess.DEVNULL)
    output = p.communicate()
    assert(output[0] is None)

runCmd(['ls', '-l'])

上述函数runCmd将运行命令cmd和一组参数。

答案 1 :(得分:1)

这是一个有趣的函数,它将使用给定的argskwargs执行您赋予它的任何个其他函数,并在运行前关闭标准输出和标准错误该功能,然后将其重新打开。

def call_quiet(func, *args, **kwargs):
    with open(os.devnull, 'w') as devnull:
        sys.stdout, sys.stderr = devnull, devnull
        try:
            return func(*args, **kwargs)
        finally:
            sys.stdout, sys.stderr = sys.__stdout__, sys.__stderr__

用法示例:

call_quiet(os.popen, f'tensorboard --logdir="{path + logdir}" --host localhost --port {pn}', 'w')

答案 2 :(得分:0)

与@green_cloak_guy的响应类似,您可以使用contextlib来减少交换板的数量,从而为您管理交换操作:

[编辑:也添加redirect_stderr。不确定是否有更好的捆绑方式]

import contextlib
import os

with contextlib.redirect_stdout(open(os.devnull, 'w')):
    with contextlib.redirect_stderr(open(os.devnull, 'w')):
        os.popen('...')