Python使用subprocess模块时隐藏输出与显示错误的参数设置方法

背景

最早我使用Python进行图片的爬取,有些图片是WebP格式,在我的Windows 7和ACDSee 3.2中显示不出来,所以我通过os.system()来调用dwebp.exe程序将WebP图片转换为PNG,但是这样做存在一个问题,就是没有办法精确的控制这个过程,一旦产生错误也很难追溯。

正文

通过简单的搜索,得知Python官方已经在3.5之后的版本里面推荐使用subprocess模块来取代os.system的方法。
以前我是这么写的:

import os
webp_path = "input.webp"
png_path = "output.png"
cmd = f'{STATIC} "{webp_path}" -o "{png_path}"'
os.system(cmd)

如今换用了subprocess模块,改为以下的形式,很简单嘛:

import subprocess
webp_path = "input.webp"
png_path = "output.png"
cmd = f'{STATIC} "{webp_path}" -o "{png_path}"'
subprocess.run(cmd)

果然,如愿得到了我们想要的结果:

Decoded input.webp. Dimensions: 520 x 220  (with alpha). Format: lossless. Now saving...
Saved file output.png

但是有时候数量太多,满屏幕都是这样的信息,就容易掩盖真正需要关注的错误,于是就搜了一下,得知可以使用这样的方法来隐藏输出:

subprocess.run(cmd, shell=True, stdout=subprocess.DEVNULL, stderr=subprocess.PIPE)

好用!
但是问题也来了,虽然隐藏了无用的信息,那有用的信息也同样被隐藏了呀。
这可怎好?

再次折腾,通过研读官方文档,想到subprocess在正常执行的时候其实会返回一个0作为函数的返回值,那发生错误的时候返回的就不是0了呗。
试验一下,故意改动一下,让它报个错试试:

import subprocess
webp_path = "iut.webp"
png_path = "output.png"
cmd = f'{STATIC} "{webp_path}" -o "{png_path}"'
subprocess.run(cmd, shell=True, stdout=subprocess.DEVNULL, stderr=subprocess.PIPE)

哎,为什么什么都没有?
对啦,因为函数的返回值没有被打印出来,所以你看不到,稍微改动一下就好了:

import subprocess
webp_path = "iut.webp"
png_path = "output.png"
cmd = f'{STATIC} "{webp_path}" -o "{png_path}"'
result = subprocess.run(cmd, shell=True, stdout=subprocess.DEVNULL, stderr=subprocess.PIPE)
print(result.returncode)

看,这不就有错误结果了。

cannot open input file 'input.webp'

所以稍加改动,就完成了全部的功能:

import subprocess

webp_path = "input.webp"
png_path = "output.png"
cmd = f'{STATIC} "{webp_path}" -o "{png_path}"'

result = subprocess.run(cmd, shell=True, stdout=subprocess.DEVNULL, stderr=subprocess.PIPE)

if result.returncode != 0:
    print("Error occurred:", result.stderr.decode())

完结,撒花~~

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值