使用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版本,不支持该语法。
有两种解决方式:
- 升级Jinja2到3.x版本(推荐,不影响pyecharts新功能)
pip install --upgrade jinja2 - 降级pyecharts到兼容Jinja2 2.x的版本(比如v1.9.0及之前版本)
pip install pyecharts==1.9.0
执行上述操作后,重新运行代码,Tab/Page组件的多图表渲染就能正常完成,单个图表的渲染也不会受影响。
内容的提问来源于stack exchange,提问作者loren_neosporin
相关产品推荐
相关产品推荐

