2.6 KiB
2.6 KiB
Python嵌入式分发方案(备选)
方案概述
如果PyInstaller sidecar方案遇到问题,可以考虑直接将Python嵌入式版本打包到应用中。
实现步骤
1. 下载Python嵌入式版本
# Windows
wget https://www.python.org/ftp/python/3.11.0/python-3.11.0-embed-amd64.zip
# 解压到 src-tauri/python-embed/
2. 安装依赖到嵌入式Python
# scripts/setup_embedded_python.py
import subprocess
import sys
from pathlib import Path
def setup_embedded_python():
embed_dir = Path("src-tauri/python-embed")
python_exe = embed_dir / "python.exe"
# 安装pip
subprocess.run([
str(python_exe), "-m", "ensurepip", "--default-pip"
])
# 安装依赖
subprocess.run([
str(python_exe), "-m", "pip", "install",
"requests", "Pillow", "opencv-python-headless"
])
# 复制python_core模块
import shutil
shutil.copytree("python_core", embed_dir / "python_core")
if __name__ == "__main__":
setup_embedded_python()
3. 修改Tauri配置
{
"bundle": {
"resources": [
"python-embed/**"
]
}
}
4. 修改Rust执行器
fn get_embedded_python_path() -> Option<PathBuf> {
let exe_dir = std::env::current_exe().ok()?
.parent()?;
let python_exe = if cfg!(target_os = "windows") {
exe_dir.join("python-embed/python.exe")
} else {
exe_dir.join("python-embed/bin/python3")
};
if python_exe.exists() {
Some(python_exe)
} else {
None
}
}
async fn execute_with_embedded_python(
module: &str,
action: &str,
params: Option<&str>,
) -> Result<String, String> {
let python_exe = get_embedded_python_path()
.ok_or("Embedded Python not found")?;
let mut cmd = Command::new(python_exe);
cmd.args(&[
"-m", &format!("python_core.{}", module),
"--action", action
]);
if let Some(p) = params {
cmd.args(&["--params", p]);
}
// 执行命令...
}
优缺点对比
PyInstaller Sidecar方案
优点:
- 单文件分发
- 启动速度快
- 内存占用相对较小
缺点:
- 构建复杂
- 调试困难
- 可能遇到兼容性问题
嵌入式Python方案
优点:
- 构建简单
- 调试容易
- 兼容性好
缺点:
- 分发包较大
- 启动速度较慢
- 安全性较低
推荐方案
- 首选:PyInstaller Sidecar方案
- 备选:嵌入式Python方案
- 开发:系统Python方案
根据项目需求和技术栈选择最适合的方案。