如何打包Python脚本为可分享程序?有什么简便轻量的实现方案
优化方案与打包原理解答
现有脚本的最简优化
你当前的shell脚本已经实现了最基础的隔离运行逻辑,唯一的问题是每次运行都会重复创建虚拟环境、重装依赖,冗余操作耗时。做少量修改就能大幅提升使用体验:
- 先在项目根目录新建
requirements.txt,统一管理所有依赖,后续加依赖只需修改这个文件即可,无需调整shell脚本:
requests # 后续新增依赖直接写在这,比如 openpyxl、lxml 等
- 优化后的shell脚本逻辑如下,仅第一次运行时会创建虚拟环境、安装依赖,后续运行直接复用现有环境:
#!/usr/bin/env zsh mydir=${0:a:h} cd "$mydir" # 虚拟环境不存在时才初始化 if [ ! -d "venv" ]; then python3 -m venv venv source venv/bin/activate pip3 install -r requirements.txt deactivate fi # 直接启动主程序 source venv/bin/activate ./scripts/a1_v2.command deactivate
更轻量的免配置打包方案
如果你想要更方便分享、不用让同事手动解压一堆文件,可以选择以下两种零学习成本的方案:
- 方案1:使用Python自带的
zipapp模块打包成单可执行文件,完全无需安装第三方工具,生成的文件只有几MB大小,只要对方电脑装有Python3就能直接运行:- 新建
build文件夹,把所有项目代码、scripts目录拷贝进去 - 执行命令把依赖安装到build目录:
pip3 install -r requirements.txt --target ./build - 执行打包命令:
python3 -m zipapp build -o 设备数据导出工具.pyz -m "a1_v2:main"
注意:你需要把主脚本
a1_v2.command的后缀改成.py,并且把所有执行逻辑封装到main()函数里,最后加一行if __name__ == "__main__": main()即可。 - 新建
- 方案2:如果需要给没装Python的同事使用,PyInstaller的极简用法完全不需要适配目录结构:
进入项目根目录直接执行命令:pyinstaller -F scripts/a1_v2.py,生成的单可执行文件会放在dist目录下,所有依赖和Python解释器都会被打包进去,对方双击就能直接运行。如果运行提示缺模块,加参数--hidden-import 缺失的模块名重新打包即可。
常见Python打包工具的核心原理
所有Python打包工具本质上只做3件事,你写的shell脚本已经实现了核心逻辑的一半:
- 依赖收集:扫描你的主脚本,自动识别所有用到的第三方模块、系统动态库、资源文件
- 环境打包:把Python解释器本体、收集到的所有依赖、你的代码打包到同一个文件夹/压缩包
- 入口引导:给打包产物加一个启动器,运行时如果是单文件版本就先临时解包到缓存目录,再调用内置的Python解释器运行你的主脚本
你如果想要自己复现核心功能,只需要把虚拟环境、你的代码一起打包,再写一个和你现有逻辑差不多的启动脚本引导运行即可,和商业打包工具的底层逻辑没有本质区别。
内容的提问来源于stack exchange,提问作者EddiKh
相关产品推荐
相关产品推荐

