在做Python 打包工具QPThttps://github.com/QPT-Family/QPT(将Python程序打包为EXE)项目的时候,需要那到一份干净的Python环境,作为Windows Runtime的基础。
由于很多开发者会关注Runtime的大小,所以需要一份轻量级的Python解释器环境。尽管Python官方提供了Embeddable方案,但该方案缺乏Tkinter的环境,那么本文将介绍如何使用Embeddable版环境以及如何在这种环境中增加TKinter的支持。
1. 如何使用Embeddable版本环境
通常在Python官方的下载列表中,会提供exe、zip、tar三种方案。其中exe已经被大家熟知,运行后点几下就能把环境安装好;而zip则是Embeddable版本,可以理解为是专门为嵌入式而做的环境,非常精简(压缩后低于10M);tar则是源码,可以自行编译。
由于Embeddable版本和标准发行版相比,删去了文档、版本说明、Tkinter,并且将site-packages
下的库打包为python3.x.zip格式,其他无较大差异,故绝大部分库均可在该版本下使用。
但需要注意的是,由于该版本主打的就是精简,所以我们需要配置以下内容方可像标准版一样使用。
1.1 用户环境变量
环境变量是为了更好在IDE、终端中访问Python,如果对终端很熟悉,加与不加也无所谓。
如果要加的花有个简单方案,打开Powershell,输入以下命令即可完成配置:
【示例】
[Environment]::SetEnvironmentVariable("PATH", $Env:Path + ";【此处填写解压后Embeddable文件的路径】")
[Environment]::SetEnvironmentVariable("PATH", $Env:Path + ";J:/Program/python38_emb")
也可以在系统设置中找到环境变量的PATH字段,里面追加自己的路径就好(想必能去考虑精简Python的开发者,一定知道如何修改环境变量)
1.2 Python内环境变量
在python38._pth中增加Lib/site-packages
一行即可
完成这些之后,在主流IDE中也能检索到该环境了,终端中也能很方便的调用。
2. Tkinter TK/Tcl适配
增加TK的方法主要为两种:
- 编译一个TK
- 从标准版中分离出TK(由于安装时可以勾选pip、帮助文档、TK是否安装,故推测不是即时编译,可以分离出编译好的文件)
由于编译的成本比较高(谁没事喜欢编译),所以选择了第二种方式进行解决
2.1 解析标准版安装包
通常Windows下程序安装包有三种非常主流的路线:
-
SFX(没错,又是它):NSIS、7z SFX Builder、WinRAR、各种支持自解压的压缩软件。(在十几年前,很多TX游戏的安装包就是这个路线,因为压缩率低,可以得到更小的安装包,便于那个光钎宽带不发达的时代)
-
Inno:十几年前软件下载站常用的封装工具,界面好看且不易篡改,避免被其他软件站拿走他用,同时压缩率也不高,很受喜爱。
-
Windows Installer:MSI结尾的安装程序,官方认可,除了微软全家桶外不见得用这个方案的软件多。
好巧不巧,Python的第一层安装包是Microsoft SFX CAB Archive
路线,而第二层是MSI,所以干脆用UniExtract来提取好了。
第一层提取后的结果是下图这样的:
由于这个文件无法直接运行,需要加点环境变量才可以,而我的电脑硬盘坏了,没安装VS的Windows 10 SDK,所以没办法反编译得到它的运行逻辑。
但问题不大,因为用UniExtract可以直接拿到文件,而且根据刚刚的猜想,非即时编译的TK,应该不需要做什么特殊处理就可以使用。
解包后的文件如下:
这时候我们在刚刚的在python38._pth中增加这四个目录的路径即可。
移植成功!