背景
最早我使用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())
完结,撒花~~