试着/除了显示错误,但我不想

2024-09-28 22:29:19 发布

您现在位置:Python中文网/ 问答频道 /正文

try:
    folderSizeInMB= int(subprocess.check_output('du -csh --block-size=1M', shell=True).decode().split()[0])
    print('\t\tTotal download progress (MB):\t' + str(folderSizeInMB), end = '\r')
except Exception as e:
    print('\t\tDownloading' + '.'*(loopCount - gv.parallelDownloads + 3), end = '\r')

我的脚本中有这段代码,因为由于某种原因,我的unix决定找不到'du'命令。它抛出一个错误/bin/sh: du: command not found

我对这段代码的希望是,即使我的程序遇到这个错误,它也只会在except块中显示消息并继续运行。但是,它会在except块中显示消息之前打印错误。为什么要这么做?有没有办法抑制try块显示的错误消息

谢谢

编辑: 我重写代码后,收到如下所示的答案,它的工作。我只需要重写一行:

folderSizeInMB= int(subprocess.check_output('du -csh --block-size=1M', shell=True, stederr=subprocess.DEVNULL).decode().split()[0])

Tags: 代码消息outputsizecheck错误shellblock
2条回答

错误由shell显示,并打印到stderr。因为你没有重定向它的stderr,它只是直接进入你自己程序的stderr,然后进入你的终端

如果您不想使用这个或任何其他shell特性,那么最简单的解决方案就是不使用shell。传递一个参数列表而不是命令行,然后去掉这个shell=True,这个错误将变成一个普通的Python异常,您可以处理已有的代码

如果只是出于某种原因使用shell,则需要重定向其stderr。您可以传递stderr=subprocess.STDOUT使其与您已经捕获的标准输出合并,或者传递subprocess.DEVNULL使其忽略。subprocess模块文档很好地解释了所有的选项,所以请阅读它们,决定您想要的行为,然后这样做

您可以尝试将stderr重定向为null以防止显示错误

import sys

class DevNull:
    def write(self, msg):
        pass

sys.stderr = DevNull()

相关问题 更多 >