Python中如何抑制终端输出同时将shell命令执行结果保存到变量
问题原因
你当前的写法直接在shell命令中添加了> /dev/null 2>&1重定向规则,把命令的标准输出(stdout)、标准错误输出(stderr)全部丢弃到了空设备,check_output只能捕获命令的stdout内容,自然拿不到任何执行结果。
另外补充一个macOS下security命令的特性:使用-ga参数查询密码时,密码内容默认会输出到stderr而非stdout,仅捕获stdout也会导致拿不到密码。
解决方案
不要在shell命令中手动添加输出重定向规则,直接通过subprocess模块的内置参数捕获进程的所有输出,只要输出没有被定向到当前终端,就不会产生终端打印,同时所有输出内容都会被保存到变量中。
方案1:使用subprocess.run(更推荐,兼容性好、可控性强)
import subprocess cmd_result = subprocess.run( "security find-generic-password -ga test", shell=True, capture_output=True, # 捕获stdout和stderr,不会输出到终端 text=True # 直接返回字符串格式结果,无需手动解码 ) # 密码内容存储在stderr中 wifi_password = cmd_result.stderr.strip() # 如需命令的标准输出,取cmd_result.stdout即可
方案2:继续使用check_output
需要额外指定把stderr合并到stdout中捕获:
from subprocess import check_output, STDOUT raw_result = check_output( "security find-generic-password -ga test", shell=True, stderr=STDOUT # 把stderr合并到stdout中统一捕获 ) # 字节串转字符串 wifi_password = raw_result.decode("utf-8").strip()
内容的提问来源于stack exchange,提问作者user16965639
相关产品推荐
相关产品推荐

