如何屏蔽subprocess.run()执行mkdir时的控制台输出?
解决subprocess执行mkdir时权限报错输出到控制台的问题
你遇到的问题是因为mkdir的权限错误信息是输出到**标准错误流(stderr)**的,而你之前的参数只处理了标准输出流(stdout),所以错误信息还是会跑到控制台。
以下是几种可行的解决方式:
方式一:将stderr也重定向到DEVNULL
直接把错误输出丢弃,适合不需要捕获错误信息的场景:import subprocess subprocess.run( ["mkdir", "-p", f"{outdir}/archive/backup_{curr_date}/"], check=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL )方式二:用capture_output=True同时捕获stdout和stderr
这个参数会把两者都捕获到返回对象的stdout和stderr属性里,不会输出到控制台。如果需要处理错误,可以搭配try-except包裹:import subprocess try: subprocess.run( ["mkdir", "-p", f"{outdir}/archive/backup_{curr_date}/"], check=True, capture_output=True, text=True # 可选:将输出转为字符串而非字节流 ) except subprocess.CalledProcessError as e: # 自定义错误处理逻辑,比如写入日志,避免控制台输出 pass注:
capture_output=True等价于stdout=subprocess.PIPE, stderr=subprocess.PIPE,之前你使用时未处理异常,导致check=True触发的错误默认会打印信息,用try-except即可拦截。方式三:将stderr重定向到stdout统一处理
如果想把错误和标准输出合并处理,可以用stderr=subprocess.STDOUT配合stdout的重定向参数:import subprocess subprocess.run( ["mkdir", "-p", f"{outdir}/archive/backup_{curr_date}/"], check=True, stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT )
核心逻辑是必须处理stderr流,权限错误的信息从这个流输出,只处理stdout无法阻止错误信息显示。
内容的提问来源于stack exchange,提问作者Vandit Goel
相关产品推荐
相关产品推荐

