京公网安备 11010802034615号
经营许可证编号:京B2-20210330
作者:李晓飞
来源:Python 技术
如果说程序员有什么怕的,那我想可能就是 —— 需求又变了!
这不,客户在笔者开发完一个基于浏览器的 Web 应用程序之后说:程序需要在内(无)部(网)环境中运行……
这就意味着无法安装 Python 环境!
谁叫咱是程序员呢,不就开发一个 GUI 版本吗,难不倒我……
可是听到给的时间后,就不淡定了……
为了不影响客户的评测,只能给出一周时间!
GUI 虽然也不难,不过需要梳理一遍服务以及与用户的交互接口,弄不好就得为 GUI 单独编写接口,这点时间显然不够呀。
不行,就再想想办法……
不然直接将 Web 应用包装成一个可执行程序,拷贝到机器上就能运行,而且类似的框架很多,比如 Nodejs 中的 Electron[1],Python 中的 Pywebview[2]。
只要将原来的 Web 程序包装一下就好了,那么说干就干!
Web 程序是用 Flask 开发的,所以需要安装 Python 的 Pywebview 作为打包工具。
建立虚拟环境[3] 或者在原来的 Web 项目环境中,执行:
pip install pywebview
在 Windows 系统中,需要 .Net 4.0 以上
小试牛刀:
import webview window = webview.create_window('Hello!', 'http://http://www.justdopython.com')
webview.start()
就能看到如下的效果:
小试牛刀
神奇吧!
Pywebview 支持三种模式,简单模式,服务器模式 和 线程模式。
简单模式 就相当于一个定制流浏览器,指定一个地址,就可以实现浏览了,如上面的例子。
服务器模式 相当于包装了一个 Web 应用,就是会启动一个本地服务器,在定制的浏览器中浏览。
线程模式 比较高级,就是需要自己手动维护线程状态,实现更高级的玩法。
对于现在的需求,我们选择服务器模式,即包装本地的一个 Web 应用。
服务器模式会为我们提供一个 HTTP Server,只要把 Web 应用部署上去就好了。
因为无非展示实际项目的代码,这里写一个简单的 Flask 应用:
关于 Flask Web 应用开发,可以参考笔者之前写的 Flask 文章
创建一个 app.py 文件:
from flask import Flask, render_template, jsonify, request
app = Flask(__name__) # 创建一个应用 @app.route('/') def index(): # 定义根目录处理器 return render_template('index.html') @app.route('/detail') def detail(): return render_template('detail.html') if __name__ == '__main__':
app.run() # 启动服务
这个应用很简单,只有两个页面,分别通过 / 和 /detail 来访问。
如果运营这段代码,就会启动一个 Flask 应用,通过 http://120.0.0.1:5000 来访问。
如何套在 Pywebview 中呢?
很简单:
import webview from app import app if __name__ == '__main__': window = webview.create_window('Pywebview', app, height=600, width=1000)
webview.start()
这里的关键是,将 Flask 应用作为 url 参数,Webview 发现传入的参数是 flask 应用,就会启动服务模式。
运行程序后,可以看到和在浏览器中的效果一样的:
对接 Flask
现在就可以将这个项目打包成 exe 了。
首先需要安装 pyinstaller[4]
pip install pyinstaller
然后进入程序目录执行:
pyinstall -F -w main.py
很快在程序目录下,就会生成一个 dist 文件夹,其中就会有个 main.exe 可执行文件,这就是打包好的结果。
双击运行,可以看到效果……
等等,好像并不是想象中的那样!
对接 Flask
这是怎么回事呢?
根据提示来看,是因为找不到页面的模板文件。
我们在前面创建 Flask app 时,使用的是默认的模板路径,即 app.py 文件所在目录的 templates 目录,为啥打包之后就找不见了呢?
这是因为在 windows 中,可执行文件的运行时,会被解压到一个特定的目录下,而我们的模板文件并没有被打包进入 exe 文件中,所以导致运行时找不见模板文件。
如何解决这个问题呢?
作为不使用外部数据或文件的程序,只需要将程序本身打包就可以了,但大部分程序都需要外部数据,比如我们的 Flask 应用,就需要用到静态文件等。
那么如何将它们打包进可执行文件呢?
只需要在打包时多加一个参数就可以了:
pyinstaller main.py -F -w --add-data "./templates/*;templates"
-- add-data 参数表示添加额外的数据 -- ./templates/* 表示需要添加当前目录的 templates 目录中的所有文件 -- ;为分隔符,其后的 templates 表示解压是这些数据所在的目录,这个目录名必须和 创建 app 时 template_folder 参数一致 -- 如果需要用到静态文件,需要额外添加,比如 --add-data "./static/*;static"
这样就能将外部数据一起打包进来了。
打包好后,双击执行,就会发现网页得以完美呈现了。
注意:
如果使用了虚拟环境,必须在虚拟环境中单独安装 pyinstaller,而不能用其他环境中已经安装好的,这是为了包装打包是可以链接所以程序引用的模块
因为 pyinstaller 打包时,找不到被引用的模块时并不报错,而打包好的程序可能会无法执行。
经过一番折腾,终于在客户要求的时间之前将工作完成了,特别高兴。
回头一想,多亏用了 Python 作为主要的开发语言,因为 Python 强悍的社区支持没有找不到的解决方法。
这次经历的另一个启示就是,遇到问题,不要着急就做,可以先想一想,是否有更好的方法,特别在使用 Python 的时候。
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
数据分析师认证考试全面升级后,除了考试场次和报名时间,小伙伴们最关心的就是报名费了,报 ...
2025-12-23CDA中国官网是全国统一的数据分析师认证报名网站,由认证考试委员会与持证人会员、企业会员以及行业知名第三方机构共同合作,致 ...
2025-12-23在Power BI数据可视化分析中,矩阵是多维度数据汇总的核心工具,而“动态计算平均值”则是矩阵分析的高频需求——无论是按类别计 ...
2025-12-23在SQL数据分析场景中,“日期转期间”是高频核心需求——无论是按日、周、月、季度还是年度统计数据,都需要将原始的日期/时间字 ...
2025-12-23在数据驱动决策的浪潮中,CDA(Certified Data Analyst)数据分析师的核心价值,早已超越“整理数据、输出报表”的基础层面,转 ...
2025-12-23在使用Excel数据透视表进行数据分析时,我们常需要在透视表旁添加备注列,用于标注数据背景、异常说明、业务解读等关键信息。但 ...
2025-12-22在MySQL数据库的性能优化体系中,索引是提升查询效率的“核心武器”——一个合理的索引能将百万级数据的查询耗时从秒级压缩至毫 ...
2025-12-22在数据量爆炸式增长的数字化时代,企业数据呈现“来源杂、格式多、价值不均”的特点,不少CDA(Certified Data Analyst)数据分 ...
2025-12-22在企业数据化运营体系中,同比、环比分析是洞察业务趋势、评估运营效果的核心手段。同比(与上年同期对比)可消除季节性波动影响 ...
2025-12-19在数字化时代,用户已成为企业竞争的核心资产,而“理解用户”则是激活这一资产的关键。用户行为分析系统(User Behavior Analys ...
2025-12-19在数字化转型的深水区,企业对数据价值的挖掘不再局限于零散的分析项目,而是转向“体系化运营”——数据治理体系作为保障数据全 ...
2025-12-19在数据科学的工具箱中,析因分析(Factor Analysis, FA)、聚类分析(Clustering Analysis)与主成分分析(Principal Component ...
2025-12-18自2017年《Attention Is All You Need》一文问世以来,Transformer模型凭借自注意力机制的强大建模能力,在NLP、CV、语音等领域 ...
2025-12-18在CDA(Certified Data Analyst)数据分析师的时间序列分析工作中,常面临这样的困惑:某电商平台月度销售额增长20%,但增长是来 ...
2025-12-18在机器学习实践中,“超小数据集”(通常指样本量从几十到几百,远小于模型参数规模)是绕不开的场景——医疗领域的罕见病数据、 ...
2025-12-17数据仓库作为企业决策分析的“数据中枢”,其价值完全依赖于数据质量——若输入的是缺失、重复、不一致的“脏数据”,后续的建模 ...
2025-12-17在CDA(Certified Data Analyst)数据分析师的日常工作中,“随时间变化的数据”无处不在——零售企业的每日销售额、互联网平台 ...
2025-12-17在休闲游戏的运营体系中,次日留存率是当之无愧的“生死线”——它不仅是衡量产品核心吸引力的首个关键指标,更直接决定了后续LT ...
2025-12-16在数字化转型浪潮中,“以用户为中心”已成为企业的核心经营理念,而用户画像则是企业洞察用户、精准决策的“核心工具”。然而, ...
2025-12-16在零售行业从“流量争夺”转向“价值深耕”的演进中,塔吉特百货(Target)以两场标志性实践树立了行业标杆——2000年后的孕妇精 ...
2025-12-15