Re: [問題] MEIPASS - No such file or directory er

作者: poototo (poototo)   2022-01-25 23:35:10
le大好說,互通有無大家求進步
您看來有一個誤解之處是
原PO的狀況是,opencc有被打包了,但並不是所有套件下的檔案都被自動打包
s2tw.json這個檔是原PO要叫pyinstaller去抓來打包進exe的
並不是日後放在exe所在電腦,使用者還要確保自己電腦有這個json檔跟opencc
打包成功,exe自己帶著走,會當場重新產生json
而重新產生的位置,就是在sys._MEIPASS下
sys._MEIPASS,是每次exe一執行時強加sys的屬性
而預設值就是OS的TEMP PATH (通常就是User目錄的AppData下)
供 add-file 那些檔案在日後每次exe執行時重新產生到_MEIPASS
透過_MEIPASS的設計,exe在任意電腦上執行,
一切就相對於預設TEMP,不用管exe本身所在位置或使用者名稱
exe執行結束,TEMP中重新產生的資源檔也會被刪除
官方說明如下,再討論
================================================
1. https://pyinstaller.readthedocs.io/en/stable/usage.html
作者: lepenseur (lepenseur)   2022-01-26 01:23:00
我明白—add-data 的檔案會放在包裝後目錄下但是,他現在執行exe的錯誤內容,就是去AppData這個目錄讀取資料,而不是從執行檔的目錄下(sys._MEIPASS)抓json所以我才說,他應該要想清楚,部署的平台要怎麼安排這些檔案放哪裡、該怎麼讀—add-data可以打包沒錯,但他程式碼是從AppData這邊抓資料,所以會繼續報錯你嘗試把一個檔案只放在AppData,其他目錄不能放,然後嘗試打包、在另一台電腦上執行看看,應該可以重現這個問題你成功打包opencc沒錯,東西也在sys._MAIPASS下沒錯,但你的程式碼就跑去AppData這個目錄抓資料,所以才出現這個錯誤提示
作者: poototo (poototo)   2022-01-26 09:02:00
1.add-data檔案【不會】放在包裝後目錄下,是在【exe中】2.exe執行檔所在目錄 != sys._MEIPASSsys._MEIPASS會指向AppData下的亂數名稱目錄如原PO的錯誤訊息中的路徑有個 _MEI151842這是exe每次執行都會當場造的(所以每次執行每次都會更新一次sys._MEIPASS)import相依套件及add-data的檔案都在_MEI151842下解壓user無法【事先部署】這些檔案,是exe自己【當場部署】原本opencc.py執行時會去讀site-package下opencc下的json打包exe後,opencc.py的讀取起點會換成sys._MEIPASS原PO只要將json打包【進exe】,指定正確的解壓path而非要求使用者電腦中要有一份json或額外安裝相依檔案使用者只要執行exe就好,不必搞環境部署
作者: lepenseur (lepenseur)   2022-01-26 16:20:00
那請問你要如何指定解壓到該使用者的AppData 呢?你一直忽略錯誤訊息裡面,去AppData讀取資料的這件事,我們一直在雞同鴨講而且真的有需要寫入資料的話,一般都是直接寫安裝精靈,安裝精靈可以做完這些事情,不會讓使用者自己去設定環境sys._MAIPASS 我知道如何使用,我也是這樣操作的。但現在的情境是,exe執行時嘗試去AppData讀取資料導致錯誤另外,pyinstaller 解壓執行超慢,一般是小專案才會用,正式的軟體幾G沒辦法等你這樣解壓,建議你了解一下pyinstaller產生資料夾的操作
作者: poototo (poototo)   2022-01-26 16:28:00
add-data就是在指定sys._MEIPASS下的解壓路徑AppData就是在sys._MEIPASS指向的路徑當中會去讀AppData下的資料就是exe的正常行為
作者: lepenseur (lepenseur)   2022-01-26 16:31:00
抱歉,剛剛去翻文件,我懂你的意思了你說的是pyinstaller -F 下的操作情形我說的是 pyinstaller -D 下的操作情形
作者: poototo (poototo)   2022-01-26 16:33:00
你的exe還會在user電腦放很多檔案才能正常執行?
作者: lepenseur (lepenseur)   2022-01-26 16:33:00
所以你才會說解壓檔案到_MAIPASS目錄下
作者: lepenseur (lepenseur)   2022-01-26 16:34:00
我寫的是要部署到客戶端電腦的軟體,基本上是一整個軟體資料夾,檔案大小有時候幾百M或幾G所以都不會使用 onefile長知識了功能稍微多一點,每次開啟onefile解壓縮就要等超久感謝poo大,讓我更了解onefile的運作機制
作者: poototo (poototo)   2022-01-26 16:40:00
剛看原PO是用 -F,但我也在想是否可以不要打包python套件import一堆,exe常100M上下,然後執行又解壓套件出來
作者: lepenseur (lepenseur)   2022-01-26 16:42:00
原ok原本加上—add-data還是掛,所以我以為他路徑設定錯,他後面也沒出來回覆可能問題已經解決了不打包python套件可能比較難,就是需要用到才import的啊XD我還是覺得onedir的方式比較好用,加上安裝精靈,資料夾安裝在C槽,桌面建立一個捷徑,方便實用

Links booklink

Contact Us: admin [ a t ] ucptt.com