You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Matplotlib动画渲染前被删除?已用plt.show()仍触发警告

问题分析与解决

警告出现的核心原因

你的代码存在两个关键错误,直接导致了该警告:

1. plt.show()放置位置错误

你把plt.show()写在了动画的更新函数plot内部。plt.show()是阻塞式调用,会暂停程序直到关闭绘图窗口。这意味着动画刚触发第一次更新就会被卡住,后续动画循环完全无法执行,动画对象还没完成渲染就被提前销毁,从而触发警告。

2. 变量名冲突

你将FuncAnimation的实例赋值给了变量plot,但你的更新函数也叫plot——这会直接覆盖原来的更新函数。动画后续尝试调用更新逻辑时,实际调用的是被覆盖的动画实例,导致动画逻辑混乱,最终被垃圾回收机制清理,触发警告。

修正后的代码

import subprocess
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation


def update_plot(i):  
    print(1)
    MyOut = subprocess.Popen("pytr portfolio",
                stdout=subprocess.PIPE, 
                stderr=subprocess.STDOUT)
    stdout,stderr = MyOut.communicate()

    chart_data = []
    days = []
    t = 0
    new_char = stdout.split()
    netValue = float(new_char[new_char.index(b'netValue') + 2])

    # 用with语句优化文件操作,自动处理文件关闭
    with open('netValue.txt','a') as file:
        file.write(f"{netValue}\n")

    with open('netValue.txt','r') as file:
        for line in file:
            t += 1
            chart_data.append(float(line))
            days.append(t)
    
    print(days)
    plt.cla()
    plt.plot(days,chart_data)
    plt.title('depot_performance')

# 给动画实例换个不冲突的变量名
anim = FuncAnimation(plt.gcf(), update_plot, interval=1000)
# 仅在最后调用一次plt.show(),启动动画循环
plt.show()

额外优化提示

  • 使用with语句操作文件,避免手动关闭文件时可能出现的遗漏或错误。
  • 显式指定FuncAnimation的interval参数名,提升代码可读性。

内容的提问来源于stack exchange,提问作者Din

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 18:20:20