背景
给上交那边医学院做的一个外包项目,项目里用到了node直接拉起python子进程通过标准输入输出来通信;然后上交那边显然不太会配置环境,只能研究能不能把项目打包成尽可能简单的形式
探索
1.Docker打包
一开始想到的就是docker打包,最近一直都在用用这个确实很方便。但是甲方是医学生,配置个wsl+docker估计又得半天,而且项目需要调用系统摄像头,docker可能存在问题,遂放弃该方案
2.node和python分开打包成exe
python用pyinstaller打包成exe放到nodejs目录下,然后再用pkg打包node项目成exe,最终直接运行打包好的exe文件
但是此方法缺点明显
- 项目中node通过模式选择会拉起6个不同的python,也就是说6个.py都要打包一遍
- node里面原来是通过spawn组合设置好的python解释器和.py路径来拉起子进程,用该方法打包的话每次还要手动修改server.js的代码以适应打包成exe的python程序,颇为麻烦
综上两点,放弃该方案
3.使用嵌入式python
将 Python 脚本和解释器 嵌入到主程序(如Node.js生成的EXE)中,可以实现完全独立的运行环境,然后在server.js中可以写死解释器路径使用项目文件夹下的python解释器路径,还优化了需要.env文件中配置解释器的麻烦
具体从效果上来说嵌入式python就类似于java的JRE(运行环境);而开发时候下载的python等于是java的JDK(开发环境)
打包流程
首先从官网下载对应版本的embbeddable package

解压到项目文件夹下/python中,修改/python下一个后缀是`.pth`的文件,将import site前的#删除(这行代码用来导入依赖的)

下面来安装pip可执行文件来安装依赖,先新建get-pip.py,将这个网页内容写入,然后打开命令行到python目录中运行`python.exe get-pip.py`,安装完成后出现Lib和Scripts文件夹
命令行进入项目文件夹,运行`python/Scripts/pip.exe install -r requirements.txt`安装依赖
之后不管是bat还是nodejs都可以使用这个嵌入式环境来运行python代码,打包给别人也不需要下载python解释器
总结
本质上嵌入式python就是个轻量化解释器,和JRE(java运行时环境)是同样定位的工具,代码打包给别人之后就可以直接运行程序而不用单独下载解释器和依赖
Comments NOTHING