python解释器runtime嵌入
python解释器runtime嵌入
背景介绍
最近遇到个项目Windrecorder,感觉挺有趣想试试,但是该项目没有打包好的软件,只能使用源码运行,最主要的是项目不支持python3.12、推荐3.11,恰好我的系统环境是python3.12,平时也经常使用,不想为了这个项目将系统环境改为3.11。
项目提供Windows批处理文件(.bat)来安装和启动项目,其中会使用到python。一个简单的方法是正常安装python3.11,然后在批处理文件中修改PATH
将3.11的路径添加进去set PATH=...\python-3.11.9\bin;%PATH%
。尚未试验,不确定是否会出现其他环境问题。
因为要专门为它额外安装一个python解释器,很麻烦,让我想到B站看到哦有些up打包的一些AI应用,里面都内嵌了runtime即python解释器,完全自己额外配置,也不会影响本地环境。
嵌入方法
查阅资料得知python除了发布一般的可安装的二进制包外,还会发布Windows平台的可嵌入二进制包,类似软件的便携版,比如python-3.11.9-embed-amd64。将该压缩包解压放入项目文件夹,即可直接根据相对路径使用该解释器。
在批处理文件中,将嵌入式python添加到PATH,后续使用python就是用的项目里的解释器。
REM 设置Python解释器路径
set PATH=%~dp0runtime\python-3.11.9-embed-amd64;%PATH%
%~dp0 表示该批处理文件所在的文件夹(绝对路径)
对于用到tkinter的项目,需要额外引入相关库文件(嵌入式python不打包tkinter)。
从完整版 Python 安装中复制所需文件:
tcl/ 目录(位于 Python 根目录)
Lib/tkinter/ 目录
DLLs/_tkinter.pyd 文件
DLLs/tcl86t.dll 和 DLLs/tk86t.dll(版本号根据 Python 版本变化)
实际上,对于一个干净的完整版python,直接简单粗暴的复制DLLS
,Lib
,tcl
即可。
然后是最关键的一步:编辑python311._pth
,将文件中的import site
取消注释,以保证sys.path能支持第三方库。
若是有其他依赖如ffmpeg也可一起放入rumtime
文件夹,在批处理文件中加入PATH。
项目的runtime目录结构如下:
Windrecorder/
├── .venv/ <-- Poetry创建的独立虚拟环境
│ ├── Scripts/
│ ├── Lib/
│ └── pyvenv.cfg
├── runtime/ <-- runtime目录
│ ├── python-3.11.9-embed-amd64/
│ └── ffmpeg/
├── pyproject.toml <-- Poetry依赖配置文件
├── poetry.lock
├── xxxx.py <-- 项目文件
├── install_update.bat <-- 安装脚本
└── start_app.bat <-- 启动脚本
conda虚拟环境
也可使用conda创建python3.11的虚拟环境以供项目使用。
conda create -n recorder python=3.11
在批处理文件中关键要使用call 命令
来激活虚拟环境,避免重启进程导致后面的命令无法正常运行
REM 激活conda虚拟环境
set "CONDA_ENV_NAME=recorder"
call conda activate %CONDA_ENV_NAME%
conda install -c conda-forge ffmpeg -y
...
REM 配置Poetry使用当前Python版本
poetry config virtualenvs.create true
poetry config virtualenvs.in-project true
REM poetry config virtualenvs.prefer-active-python true deepseek给的,但该命令不存在
注意ffmpeg必须在虚拟环境中安装,本地的ffmpeg是识别不到的
关键是call conda activate %CONDA_ENV_NAME%
和poetry config virtualenvs.in-project true
,其他地方正常使用即可。