打包完後要執行時遇到了一個問題如下
FileNotFoundError: [Errno 2] No such file or directory: '/home/XXX/tmp-dir/_MEIkGapxs/yapf_third_party/_ylib2to3/Grammar.txt' |
上網查到了這篇
https://blog.csdn.net/weixin_44243859/article/details/131890088
為了怕以上連結失效,這邊稍微重複一下內容
說是 pyinstaller 沒有自帶該第三方庫文件的hook的時候,就會導致這個包文件不被打包進來,解決辦法,寫個 hook,然後放進 pyinstaller 的 hooks 裡面,hook 文件的命名規範為: hook-yapf_third_party.py
from PyInstaller.utils.hooks import collect_data_files datas = collect_data_files("yapf_third_party")
以上就是這個 .py 的內容
但具體來說我還是不知道怎麼做
於是再查到了這篇
https://blog.csdn.net/cliffordl/article/details/138065845
看了這篇之後就明白很多
如果我要打包 main.py,然後我要讓他去 hook 一些 library
那我就在 main.py 旁邊開一個 hooks 資料夾
然後把上面的 hook-yapf_third_party.py 丟進這個資料夾
(其中 hook-xxx.py 的 xxx 就是 library 名稱)
然後在打包時加入 --additional-hooks-dir ./hooks
所以整個打包的指令就變成
pyinstaller -F -c --additional-hooks-dir ./hooks main.py
這個問題這樣就解決了,然後接下來又遇到
ModuleNotFoundError: No module named 'mmcv._ext'
繼續上網查,發現這篇
https://blog.csdn.net/gc5218112/article/details/125172123
OK,他說要在 hiddenimports 加入 'mmcv', 'mmcv._ext'
找到 main.spec,照著加進去,然後執行
pyinstaller main.spec
問題也確實解決了,但這樣很不方便,我希望可以不要去改 .spec
所以這個命令可以寫成
pyinstaller -F -c --additional-hooks-dir ./hooks --hidden-import mmcv --hidden-import mmcv._ext main.py
這樣全部的問題都解決了,大功告成