尝试/除了显示错误,但我不希望它

时间:2018-07-26 23:40:27

标签: python unix exception-handling

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])

2 个答案:

答案 0 :(得分:3)

shell正在显示错误,并打印到stderr。因为您没有重定向它的stderr,它只会直接进入您自己程序的stderr,该stderr会进入您的终端。

如果您不需要此功能或任何其他Shell功能,那么最简单的解决方案就是不使用该外壳。传递参数列表而不是命令行,然后删除该shell=True,该错误将成为普通的Python异常,您可以使用已有的代码进行处理。

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

答案 1 :(得分:0)

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

import sys

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

sys.stderr = DevNull()