主要是记录一个 用虚拟环境打包的坑, Virtualenv 不如自带的 venv 香.
需求
最近要对一个 tkinter 小程序打包为 exe. 毕竟业务人员是绝对不可能安装开发环境的. 不论你怎么说它如何强大.
代码是多文件夹的, 写了一个主程序 main.py 来控制主逻辑. 即要对它进行打包 exe. 百度了一下, 主流的方式用第三方库 pyinstaller. 然后创建虚拟环境, 打包, 怎么也打不了, 心态崩溃了好几天...
采坑 Virtualenv
之前有写过一点 web, 第一步就是要创建一个虚拟环境来开发嘛, 将其与其他的环境隔离开来. 因为不涉及打包exe这种骚操作, 搞完直接部署服务器. 因此参考百度的, 当时 99% 都是说 win下用第三方库 Virtualenv 来创建虚拟环境. web 倒是没呀问题, 可一打包就会发现, 虚拟环境跟其他环境, 根本就没有隔离开.
当然也回顾一下流程, 通用的嘛.
首先, 安装第三方库 Virturalenv
在 cmd 下,
pip install virtualenv
如果已经装了, 或想重装, 可以删掉. pip uninstall virtualenv
然后, 创建虚拟环境
virtualenv ENV
这会创建ENV/lib/
、ENV/include
、ENV/bin
(Windows系统下是ENV/Scripts
)几个文件夹,它们共同构成了一个完整的Python环境。在ENV/lib/
中有pip等工具用于安装第三方包,它们和系统中已安装的Python互不关联。
这里有一个额外参数--system-site-packages
,如果在创建虚拟环境的时候使用该参数,虚拟环境会继承主环境的所有第三方包。如果你希望虚拟环境和主环境独立,就不要用这个参数。操作上, 就是对文件目录的一个管理而已.
要激活创建的虚拟环境,需要执行虚拟环境其中的activate脚本:(win 下 在 Scripts 目录下有一个 activate.bat) 的脚本文件, 执行它就进入了虚拟环境了.
# cd 到 Scripts 目录下 (目录路径那, 键入 cmd 即可快速进入)
activate.bat
# 退出
deactivate.bat
非常简单对吧. 然后就死活 环境打包失败, 困扰了好久, 我一直以为是 打包库的bug, 可见, 解决问题最难的地方是, 一开始方向就错了.
反复试错, 后来发现, 打包的时候, 在虚拟环境中, 会莫名其妙关联到其它环境的包, 因此才想到, 肯定是 虚拟环境的问题.
反复抓狂....
自带的 venv 虚拟环境
后来, 小王告诉我, 干嘛不用 自带的 venv 虚拟环境, 真香.
3 行命令创建及进入虚拟环境.
假设呢, 我要在我的 D 盘下创建一个虚拟环境, 名为 my_venv.
python - m venv my_venv
然后进入进入到 my_venv 下的 Scripts 文件夹下, 运行 activate.bat 即可.
cd my_venv/scripts
activate.bat
就这 3行命令就搞定了, 不需要装其他的包和配置啥环境变量, 是真的香.
退出虚拟环境: deactivate.bat
删除虚拟环境: 删除文件夹即可. 最为简单粗暴.
配置虚拟环境
就是环境需要的包安装, 通常都是写完一个 requirements.txt 的文件.
pip install -r requirements.txt
当然, 一个个地安装也可以.
环境已好下, 生成 requirements.txt 文件: 终端: pip freeze > ./requirements.txt 就是 ">" 这管道命令.
通过本地安装: setup.py install (通常下载的包, 顶层是有一个 setup.py 的文件的.
进入项目打包 exe
这个操作是非常自然的. 安装, 然后一行命令打包.
pip install pyinstaller
然后对项目的 main.py 所在目录层级下, 进行打包.
pyinstaller -F -w main.py
-F 是打为一个文件, 在执行完后, 生成的 dist 目录下, 有一个 main.exe 的文件, 拷贝到哪都可以运行.
直接打呢, 会有很多文件, 然后找到main.exe, 创建个快捷方式来访问, 这两种都是我经常的方式.
-w : 是运行时显示黑窗口, 第一次会加上, 相等于是一个 debug 版本. 没问题再去掉.
测试没有问题了. 再打一版本.
pyinstaller -F main.py
如果有图片资源等, 要另外放到相应的文件下, 这里不上图和操作了. 主要这篇是为了记录采坑和记住这几个命令, 毕竟, 网上的很多所谓答案, 都不如自己记一笔的好.
小结
-
优先用内置模块, venv,还有像之前的, 一行实现 httpserver传文件等. 内置的才是真香, 操作简单, 效率高.
-
熟练用 pyinstaller 这类打包 exe 工具. 怎么说了. 学会了, 发现用 python偶尔写桌面程序给别人用还 挺有意思.
-
写代码真的就是个采坑的过程... 学之愈深, 坑也愈多, 其乐无穷.