在上一篇中讲解了如何修改pyecharts-gallery-master中的py源程序并配置本地的js文件资源pyecharts-assets,启动服务器、从而解决在离线环境下PyEcharts不出图的问题,但是pyecharts-gallery-master中的例子那么多,逐一修改所有的py文件并重新生成太过麻烦了,能不能编译个程序一键生成呢?
答案是肯定的,而且,chenjianxin大神也已经为我们准备好了框架和绝大部分代码,我们只需要进行简单的修改即可实现上述的“一键修改”功能,诀窍就在大神为我们准备的run_All.py
其实,chenjianxin大神编写run_all.py的目的应该是为各种写好了的绘图示例生成对应的html文件,所以我们只需要完成在利用python编译绘图.py源程序前,添加如下所示的配置本地js地址的语句即可:
#LocalhostConfig
#离线使用的时候只需要在顶部声明 CurrentConfig.ONLINE_HOST 即可
from pyecharts.globals import CurrentConfig
CurrentConfig.ONLINE_HOST = "http://127.0.0.1:8000/assets/"
当然,除了上面的一点,chenjianxin大神的run_All.py中还需要进行一点儿修改,以增强容错性,主要就是要考虑利用python编译的时候的异常处理,因为在很多例子中,除了利用了js文件外,还用到了一些需要实时联网才能获得的数据,还有就是百度地图BMap中的那几个例子,也都需要上网才行,所以是无法进行正常编译的,如果不进行异常处理,会一出现这种需要联网的例子,就会中止运行了。。。
下面就给出具体的代码——
前面修改后的代码如下:
import hashlib
import json
import os
import subprocess
import operator
import random
import time
from typing import Dict, List, Optional
from jinja2 import Template
# 清理的命令
ClearCmd: str = (
'find ./ -mindepth 2 -type f ! -name "*.py" ! -name "*.json" ! '
'-path "./.idea/*" ! -path "./.mypy_cache/*" ! -path "./.git/*" '
"| xargs rm -f"
)
# 命令解释:搜索当前目录下除根目录外的子文件夹中后缀不为 .py 和 .json 的文件,且忽略 .idea, .mypy_cache, .git 文件夹
# find ./ -mindepth 2 -type f ! -name "*.py" ! -name "*.json" !
# -path ".//.idea/*" ! -path ".//.mypy_cache/*" ! -path ".//.git/*"
# {上面的命令} | xargs rm -f
# {上面的命令} -exec rm -f {} \;
def clear_all():
print("正在清理...")
try:
print(ClearCmd)
os.system(ClearCmd)
time.sleep(3)#等待清理的执行
print("清理成功!")
except Exception as err:
raise err
strpath=r"C:\WorkDir\pyecharts-gallery-master"
os.chdir(strpath)
os.listdir()
# 需要跳过的文件名
SKIP_FILE: List = [
".git",
".mypy_cache",
".idea",
"run_all.py",
"README.md",
"README_EN.md",
"LICENSE",
"index.html",
"CNAME",
"favicon.ico",
"_sidebar.md",
"_navbar.md",
"_coverpage.md",
".nojekyll",
".DS_Store",
"file_checker.json",
".ipynb_checkpoints",
"run_All.ipynb",
]
主要是设置路径和增加了两个需要跳过的文件: ".ipynb_checkpoints", "run_All.ipynb",这个很容易理解,因为在用Jupyter Notebook运行时会额外生成这两个文件;
最核心的修改地方在函数write_chart_markdown_and_html中,具体的修改后代码如下所示:
def write_chart_markdown_and_html(chart_script: str, chart_script_name: str, folder: str):
"""
保存各图的 markdown 和 html
:param chart_script: 路径
:param chart_script_name: 脚本名称
:param folder: 文件夹名字
"""
strhost="""#LocalhostConfig
# 配置CurrentConfig.ONLINE_HOST为本机地址资源
from pyecharts.globals import CurrentConfig
CurrentConfig.ONLINE_HOST = "http://127.0.0.1:8000/assets/"
"""
chart_model = ChartMarkdownModel
with open(f"{chart_script_name}.md", "w", encoding='utf-8') as md:
with open(chart_script, "r",encoding='utf-8') as f:
strtmp=f.read()
chart_model = chart_model.replace("{code}", strtmp)
chart_model = chart_model.replace("{html}", f"{folder}/{chart_script_name}.html")
md.write(chart_model)
with open(chart_script, "w",encoding='utf-8') as fpy:
if not strtmp.startswith("#LocalhostConfig"):# 如果原代码前端还没有配置本地地址资源...
strtmp=strhost+strtmp# 在原代码前端添加本地地址资源
fpy.write(strtmp)
try:#在新的线程中运行py程序,从而生成对应的网页
subprocess.check_call(["python", chart_script], stdout=subprocess.PIPE)
except Exception as err:
#print(err)
print("------> run "+chart_script + " error <-------")
主要修改的地方就是:首先,我添加了用来表示本地js文件配置代码的strhost字符串;然后,在每次打开py源文件的时候利用#LocalhostConfig进行了一个判断,看是否已经添加过,如果已经添加过了就不再重复添加了(避免有的时候程序运行一半出错了重新运行时前面的源程序重复添加的情况出现);最后,在利用subprocess子线程中利用python对源程序文件进行编译时,添加了try。。。except的异常处理机制,当某个特定的需要联网的示例py程序编译出错的时候不至于中断,而是记录下这些例外的示例程序。。。
现在,运行run_All.py即可看到整个文件夹下所有的py程序先是被添加了本地js文件配置代码,然后再进行python编译,从而重新生成了html文件!
结合上一篇的讲述,我们新打开一个控制台程序,并运行了python -m http.server -d C:\Users\super\pyecharts-assets-master命令启动js文件服务后,就可以看到各种漂亮的示例html的效果了,开启我们神奇的PyEcharts数据可视化学习之旅吧!如下图所示: