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])
答案 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()