前言
嘗試使用tauri2+Django+React的項目-CSDN博客https://blog.csdn.net/qq_63401240/article/details/146403103在前面筆者不知道怎么做,搞了半天
筆者看到官網,原來可以使用二進制文件,好好好
嵌入外部二進制文件 | Taurihttps://v2.tauri.app/zh-cn/develop/sidecar/
準備
根據官網,進入如下配置
1、在src-tauri目錄下新建bin或者binaries
2、將manage.exe(Django打包文件)放入bin目錄下,并且按照操作系統改名,筆者改的名
manage-x86_64-pc-windows-msvc。
3、在配置文件tauri.config.json中,在bundle添加值binaries/manage
"bundle": {"active": true,"targets": "all","externalBin": ["binaries/manage"],"icon": ["icons/32x32.png","icons/128x128.png","icons/128x128@2x.png","icons/icon.icns","icons/icon.ico"]}
4、配置許可
{...."shell:allow-execute","shell:allow-kill",}
正文
1、運行時,打開exe
2、關閉時,斷開exe
思考
如何在運行項目時,打開exe?
這需要用到tauri的一個結構體Builder,,其中有個方法setup,項目運行時,就會運行其中的代碼
Builder in tauri - Rusthttps://docs.rs/tauri/2.4.0/tauri/struct.Builder.html#method.setup
如何關閉項目時,關閉exe
使用build中的窗口事件on_window_event。
Builder in tauri - Rusthttps://docs.rs/tauri/2.4.0/tauri/struct.Builder.html#method.on_window_event
關鍵代碼如下
use std::sync::{Arc, Mutex};.........
..........setup(|app| {let sidecar_child = Arc::new(Mutex::new(None)); // 用于存儲 CommandChild 對象app.manage(sidecar_child.clone()); // 將 sidecar_child 存儲在全局狀態中let app_handle = app.handle().clone();let sidecar_command = app_handle.shell().sidecar("manage").unwrap().args(["runserver", "--noreload"]);// 啟動命令// 檢查是否已經啟動了子進程if sidecar_child.lock().unwrap().is_none() {match sidecar_command.spawn() {// 啟動exeOk((mut rx, mut child)) => {*sidecar_child.lock().unwrap() = Some(child); // 存儲子進程Ok(())}Err(e) => {eprintln!("Failed to spawn sidecar: {}", e);Err(Box::new(e))}}} else {Ok(())}})
use tauri::WindowEvent;
.....
.... .on_window_event(|window, event| {if let WindowEvent::CloseRequested { api, .. } = event {// 獲取 Sidecar 進程句柄let sidecar_child = window.state::<Arc<Mutex<Option<CommandChild>>>>();if let Some(mut child) = sidecar_child.lock().unwrap().take() {let _ = child.kill(); // 關閉進程println!("Sidecar process stopped on window close.");}}})
打包后,打開任務管理器
運行的發現——第一點
打開debug文件,
?
可以發現其中有manage.exe,如果把它刪除,運行會報錯。
看來上篇文章中,把manage.exe文件放到debug中,沒有問題。
運行的發現——第二點
打開任務管理器,有一個進程,但是為什么會有兩個,這兩個都是進程,都有PID
這其實筆者感到疑惑
?
關閉運行
為什么只關掉了一個進程
對于這個問題,筆者打開了bin目錄下exe,在powershell中單獨打開manage.exe文件
./manage-x86_64-pc-windows-msvc.exe runserver --noreload
?查看進程
居然會有兩個?,原來本就有兩個,以前還沒發現
如果關閉powershell
發現兩個都關閉了。?????????
難道是manage.exe的問題,打包有問題嗎?
筆者打開沒有打包之前的后端,運行Django
python manage.py runserver
在任務管理器中,原來有4個python?
關閉之后,都關閉了。筆者問了問deepseek
當你運行?
python manage.py runserver
?時,任務管理器顯示有多個 Python 進程是正常現象。這是因為 Django 的開發服務器(runserver
)會啟動多個線程或子進程來處理請求和后臺任務。
?當使用?
-F
?參數(打包為單個 EXE 文件)時,PyInstaller 會將程序解壓縮到一個臨時目錄并運行。第二個進程是實際的程序,而第一個進程是用于在程序退出或崩潰后清理臨時目錄的守護進程
原來如此。manage.exe會打開兩個進程,而kill方法只關閉了一個進程。
筆者搜了搜,原來是打包的原因,哈哈哈哈哈
python打包的exe運行后有兩個進程_mob649e81540090的技術博客_51CTO博客https://blog.51cto.com/u_16175432/8031448Two process instance when i run "exe" which is generated by pyinstaller? · Issue #2483 · pyinstaller/pyinstaller
https://github.com/pyinstaller/pyinstaller/issues/2483
解決這個問題
1、不打包成單個文件
打包成多個文件
pyinstaller manage.exe
?結果如下
?準備
(1)將_internal放到src-tauri目錄下
(2)manage.exe放到bin目錄下,并改名
(3)修改配置文件tauri.config.json的bundle
"bundle": {"active": true,"targets": "all","externalBin": ["binaries/manage"],"resources":["_internal"],"icon": ["icons/32x32.png","icons/128x128.png","icons/128x128@2x.png","icons/icon.icns","icons/icon.ico"]}
運行。
成功,完美,哈哈哈哈哈
2、繼續使用單個文件
筆者多次嘗試,發現對于打包成單個文件manage.exe的運行過程
首先,沒有出現Django的文字的時候,只有一個進程
然后,當下面出現文字,就變成兩個
當終結先出現的manage.exe,剩下一個運行,
訪問127.0.0.1:8000,是成功的
當終結后出現的manage.exe,全部都關閉
因此,筆者有這個想法,如果在Tauri想辦法關閉后面出現的線程,就可以完全關閉。
理論上,筆者覺得沒有問題。
為什么不全部關了,哈哈哈哈哈
打包
Tauri打包
運行打包命令
pnpm run tauri:build
安裝后,目錄如下
可以運行。ok
終于完成了。