如何让os.system()或subprocess.call()不输出终端内容与错误信息?
屏蔽os.system()和subprocess.call()的终端输出
处理os.system()
直接在执行的命令末尾加上输出重定向,把标准输出和错误都导向空设备:
- Linux/macOS环境:
os.system("your_command > /dev/null 2>&1") - Windows环境:
os.system("your_command > NUL 2>&1")
2>&1的作用是把错误输出(文件描述符2)重定向到和标准输出(文件描述符1)相同的位置,这样所有输出都会被丢弃。
处理subprocess.call()
用subprocess自带的参数控制输出更可靠,不需要依赖shell的重定向语法:
- Python 3.3及以上版本,直接用
subprocess.DEVNULL:import subprocess # 带shell=True的情况(命令是字符串形式) subprocess.call("your_command", stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, shell=True) # 不带shell的安全写法(命令拆成列表) subprocess.call(["your_command", "arg1", "arg2"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) - 旧版本Python(低于3.3),可以用
os.devnull替代:import os import subprocess with open(os.devnull, 'w') as devnull: subprocess.call("your_command", stdout=devnull, stderr=devnull, shell=True)
额外说明
- 线程(threading)只是让代码在后台运行,和屏蔽子进程输出无关,输出控制要针对os.system/subprocess的调用本身处理。
- 如果还是有输出,大概率是目标命令本身直接往终端写输出(而非通过stdout/stderr),这种情况比较少见,可尝试把命令放到后台执行(比如Linux加
&,但结合重定向一起用)。
内容的提问来源于stack exchange,提问作者Ethan Kinney
相关产品推荐
相关产品推荐

