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

使用pyecharts多图表渲染时遇jinja2.TemplateAssertionError错误排查

pyecharts使用Tab/Page组件渲染报错:jinja2.exceptions.TemplateAssertionError: no test named 'true'

问题描述

使用pyecharts搭建网页仪表盘时,单个图表渲染为HTML文件可成功完成,但使用Tab或Page组件将多个图表整合到单个HTML文件时,持续出现jinja2.exceptions.TemplateAssertionError: no test named 'true'错误。测试pyecharts官网的简单Page布局示例代码,出现类似错误但提示no test named 'false'。

代码示例

from pathlib import Path
import pandas as pd
from pyecharts import options as opts
from pyecharts.charts import Bar, Page, Tab


df = pd.DataFrame({'Name': ["Person A", 'Person B', 'Person A', 'Person B'],
                    'Day': ['Monday', 'Monday', 'Tuesday', 'Tuesday'],
                   'Sales': [100, 350, 400, 500],
                   'Profit': [50, 175, 200, 250]})

group_by_name = df.groupby(by=['Name']).sum()[['Sales', 'Profit']]
group_by_day = df.groupby(by=['Day']).sum()[['Sales', 'Profit']]

barchart_by_name = (
    Bar()
   .add_xaxis(group_by_name.index.tolist())
   .add_yaxis('Sales', group_by_name['Sales'].round(0).tolist())
   .add_yaxis('Profit', group_by_name['Profit'].round(0).tolist())
   .set_global_opts(
        title_opts=opts.TitleOpts(title='Fake Sales by Rep', subtitle='USD')
    )
)

barchart_by_day = (
    Bar()
   .add_xaxis(group_by_day.index.tolist())
   .add_yaxis('Sales', group_by_day['Sales'].round(0).tolist())
   .add_yaxis('Profit', group_by_day['Profit'].round(0).tolist())
   .set_global_opts(
        title_opts=opts.TitleOpts(title='Fake Sales by Day', subtitle='USD')
    )
)

#barchart_by_name.render('Test.html') ##rendering a single chart works fine


#Create HTML file
tab = Tab(page_title='Dashboard Test')
tab.add(barchart_by_name, 'Fake Sales by Rep')
tab.add(barchart_by_day, 'Fake Sales by Day')
tab.render(Path.cwd() / 'Dashboard Test.html')

完整错误信息

Traceback (most recent call last):
  File "C:\Users\mycomputer\AppData\Roaming\JetBrains\PyCharmCE2023.1\scratches\scratch_25.py", line 51, in <module>
    tab.render(Path.cwd() / 'Dashboard Test.html')
  File "C:\Users\mycomputer\AppData\Local\Continuum\anaconda3\lib\site-packages\pyecharts\charts\composite_charts\tab.py", line 146, in render
    return engine.render(self, path, template_name, env, **kwargs)
  File "C:\Users\mycomputer\AppData\Local\Continuum\anaconda3\lib\site-packages\pyecharts\render\engine.py", line 76, in render
    template_name=template_name, chart=chart, path=path, **kwargs
  File "C:\Users\mycomputer\AppData\Local\Continuum\anaconda3\lib\site-packages\pyecharts\render\engine.py", line 55, in render_chart_to_file
    tpl = self.env.get_template(template_name)
  File "C:\Users\mycomputer\AppData\Local\Continuum\anaconda3\lib\site-packages\jinja2\environment.py", line 830, in get_template
    return self._load_template(name, self.make_globals(globals))
  File "C:\Users\mycomputer\AppData\Local\Continuum\anaconda3\lib\site-packages\jinja2\environment.py", line 804, in _load_template
    template = self.loader.load(self, name, globals)
  File "C:\Users\mycomputer\AppData\Local\Continuum\anaconda3\lib\site-packages\jinja2\loaders.py", line 125, in load
    code = environment.compile(source, name, filename)
  File "C:\Users\mycomputer\AppData\Local\Continuum\anaconda3\lib\site-packages\jinja2\environment.py", line 591, in compile
    self.handle_exception(exc_info, source_hint=source_hint)
  File "C:\Users\mycomputer\AppData\Local\Continuum\anaconda3\lib\site-packages\jinja2\environment.py", line 780, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "C:\Users\mycomputer\AppData\Local\Continuum\anaconda3\lib\site-packages\jinja2\_compat.py", line 37, in reraise
    raise value.with_traceback(tb)
  File "C:\Users\mycomputer\AppData\Local\Continuum\anaconda3\lib\site-packages\pyecharts\render\templates\simple_tab.html", line 11, in template
    {% if chart.use_custom_tab_css is not true %}
  File "C:\Users\mycomputer\AppData\Local\Continuum\anaconda3\lib\site-packages\jinja2\environment.py", line 543, in _generate
    optimized=self.optimized)
  File "C:\Users\mycomputer\AppData\Local\Continuum\anaconda3\lib\site-packages\jinja2\compiler.py", line 82, in generate
    generator.visit(node)
  File "C:\Users\mycomputer\AppData\Local\Continuum\anaconda3\lib\site-packages\jinja2\visitor.py", line 38, in visit
    return f(node, *args, **kwargs)
  File "C:\Users\mycomputer\AppData\Local\Continuum\anaconda3\lib\site-packages\jinja2\compiler.py", line 754, in visit_Template
    self.blockvisit(node.body, frame)
  File "C:\Users\mycomputer\AppData\Local\Continuum\anaconda3\lib\site-packages\jinja2\compiler.py", line 378, in blockvisit
    self.visit(node, frame)
  File "C:\Users\mycomputer\AppData\Local\Continuum\anaconda3\lib\site-packages\jinja2\visitor.py", line 38, in visit
    return f(node, *args, **kwargs)
  File "C:\Users\mycomputer\AppData\Local\Continuum\anaconda3\lib\site-packages\jinja2\compiler.py", line 1157, in visit_If
    self.visit(node.test, if_frame)
  File "C:\Users\mycomputer\AppData\Local\Continuum\anaconda3\lib\site-packages\jinja2\visitor.py", line 38, in visit
    return f(node, *args, **kwargs)
  File "C:\Users\mycomputer\AppData\Local\Continuum\anaconda3\lib\site-packages\jinja2\compiler.py", line 70, in new_func
    return f(self, node, frame, **kwargs)
  File "C:\Users\mycomputer\AppData\Local\Continuum\anaconda3\lib\site-packages\jinja2\compiler.py", line 1497, in visitor
    self.visit(node.node, frame)
  File "C:\Users\mycomputer\AppData\Local\Continuum\anaconda3\lib\site-packages\jinja2\visitor.py", line 38, in visit
    return f(node, *args, **kwargs)
  File "C:\Users\mycomputer\AppData\Local\Continuum\anaconda3\lib\site-packages\jinja2\compiler.py", line 70, in new_func
    return f(self, node, frame, **kwargs)
  File "C:\Users\mycomputer\AppData\Local\Continuum\anaconda3\lib\site-packages\jinja2\compiler.py", line 1607, in visit_Test
    self.fail('no test named %r' % node.name, node.lineno)
  File "C:\Users\mycomputer\AppData\Local\Continuum\anaconda3\lib\site-packages\jinja2\compiler.py", line 315, in fail
    raise TemplateAssertionError(msg, lineno, self.name, self.filename)
jinja2.exceptions.TemplateAssertionError: no test named 'true'

解决方案

这是依赖版本不兼容导致的问题:pyecharts的模板使用了Jinja2 3.x版本新增的is true/is false测试语法,但你当前环境的Jinja2是2.x版本,不支持该语法。

有两种解决方式:

  1. 升级Jinja2到3.x版本(推荐,不影响pyecharts新功能)
    pip install --upgrade jinja2
    
  2. 降级pyecharts到兼容Jinja2 2.x的版本(比如v1.9.0及之前版本)
    pip install pyecharts==1.9.0
    

执行上述操作后,重新运行代码,Tab/Page组件的多图表渲染就能正常完成,单个图表的渲染也不会受影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 22:24:56