使用Python的 pygifsicle
压缩GIF图片时收到错误
Traceback (most recent call last):
File "main.py", line 9, in <module>
optimize(path)
File "D:\Python3.7.5\lib\site-packages\pygifsicle\pygifsicle.py", line 64, in optimize
gifsicle(source, *args, **kwargs, optimize=True)
File "D:\Python3.7.5\lib\site-packages\pygifsicle\pygifsicle.py", line 53, in gifsicle
str(colors), "--output", destination])
File "D:\Python3.7.5\lib\subprocess.py", line 339, in call
with Popen(*popenargs, **kwargs) as p:
File "D:\Python3.7.5\lib\subprocess.py", line 800, in __init__
restore_signals, start_new_session)
File "D:\Python3.7.5\lib\subprocess.py", line 1207, in _execute_child
startupinfo)
FileNotFoundError: [WinError 2] 系统找不到指定的文件。
根据报错信息可以推断
optimize() -> gifsicle() -> call() -> __init__() -> _execute_child()
分别查看函数,发现call()
用于运行命令,上网查找关于 subprocess.py
call函数
的相关信息。
发现:
错误原因:
默认情况下,subprocess模块
直接fork子进程来执行需要运行的程序,而不是使用shell
来执行程序,但subprocess模块
在Windows环境中开启子进程中需要使用echo
,但echo
不是单独的可执行文件,是Windows命令行的内置命令,所以执行echo
需要使用到命令行,也就是shell
,当subprocess模块
把echo
当作独立程序来处理时候,是找不到echo
这个程序的,所以报了
FileNotFoundError: [WinError 2] 系统找不到指定的文件。
错误
解决方案:
修改subprocess
中类Popen
的__init__()
的参数shell=False
为shell=True
,使用shell
来执行程序