我正在通过os.popen向cmd编写命令,但是此命令的结果是无用的“垃圾”,我对此不感兴趣。我只需要运行该命令,就不希望任何东西退回。
PS:接受使用os.system或子流程模块的任何其他解决方案。但是请记住,该命令将使该cmd终端永远处于繁忙状态,这是无尽的。我只想从我的主程序中运行它,然后转到其他内容,而不是等待输出,而且我不想一开始就看到输出。
编辑:人们要求输入实际代码:
os.popen(f'tensorboard --logdir="{path + logdir}" --host localhost --port {pn}', 'w')
答案 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)
这是一个有趣的函数,它将使用给定的args
和kwargs
执行您赋予它的任何个其他函数,并在运行前关闭标准输出和标准错误该功能,然后将其重新打开。
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('...')