Cartopy加载Stamen底图触发PIL告警致Anaconda Spyder内核卡死求助
根因说明
该告警是Pillow库处理带透明属性的调色板模式(P模式)PNG图片时的已知提示,触发程序卡死的原因有两个:
- 当前使用的Python3.8配套的Pillow、Cartopy版本较低,对这类特殊格式图片的处理存在缺陷,极端情况下会出现内存泄漏或逻辑死锁
- 代码设置的画布尺寸过大(90*50英寸),会大幅提升瓦片加载的内存占用,放大了格式处理的异常问题
解决方案
1. 依赖升级(最有效方案)
打开Anaconda Prompt,执行以下命令升级对应包,修复底层缺陷:
- 升级Pillow到9.0及以上版本,修复调色板透明图片处理bug:
conda install pillow>=9.0.0 - 升级Cartopy到0.20及以上版本,优化瓦片图加载逻辑:
conda install cartopy>=0.20.0
2. 代码层面优化
2.1 调整画布参数
不要用超大画布尺寸,改用dpi控制输出清晰度,避免内存占用过高:
# 原代码 fig = plt.figure(figsize=(90, 50)) 替换为以下内容 fig = plt.figure(figsize=(18, 10), dpi=300)
2.2 强制图片格式转换
在代码导入模块部分添加逻辑,自动将所有P模式带透明的图片转为RGBA格式,直接消除告警触发条件:
from PIL import Image # 覆盖默认图片打开方法,自动转换异常格式 original_img_open = Image.open def safe_img_open(*args, **kwargs): img = original_img_open(*args, **kwargs) if img.mode == 'P' and 'transparency' in img.info: img = img.convert('RGBA') return img Image.open = safe_img_open
2.3 应急屏蔽告警
如果暂时无法升级依赖,可以临时屏蔽该类告警(仅做应急,无法解决卡死问题):
import warnings warnings.filterwarnings("ignore", category=UserWarning, module="PIL.Image")
3. 运行环境优化
- 提前缓存瓦片资源:首次运行成功加载对应区域的瓦片后,Cartopy会自动将资源缓存到你配置的
pre_existing_data_dir路径,后续运行无需重复拉取在线资源,减少异常概率 - 关闭Spyder交互式渲染:在代码开头添加
plt.ioff(),绘图完成后调用plt.show()显式渲染,避免IPython内核后台渲染冲突导致卡死
内容的提问来源于stack exchange,提问作者sdewitt
相关产品推荐
相关产品推荐

