Python 打包工具 Nuitka 入門指南
起因
由于最近用Python寫了一個(gè)跟目標(biāo)檢測(cè)相關(guān)的小工具,如果直接分發(fā)代碼文件一來是不夠優(yōu)雅,二來是對(duì)非計(jì)算機(jī)領(lǐng)域的用戶來說不夠友好,因此我萌生了給小工具打包的想法。
本來我以為這應(yīng)該是一個(gè)輕松而愉快的過程,一行命令一個(gè)回車,然后去摸魚20分鐘,回來就可以收獲到一個(gè)完美打好包的可執(zhí)行文件。然而事情并沒有我想象的那般順利,甚至可以說是困難重重、荊棘叢生。不斷地排查原因查找可能的錯(cuò)誤,最后我花了兩天的時(shí)間才終于打出了一個(gè)可以完美運(yùn)行的可執(zhí)行文件。
因此,我希望這一篇文章可以幫助到也正在為Python程序打包而苦惱的同學(xué)們。
環(huán)境
- Python 3.9 (CPython)
- Nuitka 1.5.3
常用選項(xiàng)
通用選項(xiàng)
- –standalone 使得打包結(jié)果與本地的Python環(huán)境無關(guān),即使得打包結(jié)果具備可移植性。
- –onefile 使得打包結(jié)果為一個(gè)可執(zhí)行文件,而不是一個(gè)文件夾。
小結(jié):--onefile
選項(xiàng)下打出來的包本身就具備可移植性,因此不需要額外加上 --standalone
。--onefile
打包結(jié)果像綠色軟件,僅一個(gè)可執(zhí)行文件;--standalone
的打包結(jié)果像經(jīng)過安裝的軟件,文件夾下包含運(yùn)行所需要的文件和程序入口。
- –remove-output 在打包結(jié)束后,清理打包過程中生成的臨時(shí)文件。
-
–enable-plugin= 啟用插件,等號(hào)后跟插件名。在要打包的Python代碼使用了一些特殊的包時(shí),需要啟用插件,Nuitka才能夠正確打包。如:如在代碼中使用了PySide6,就需要加上
--enable-plugin=pyside6
。具體的插件列表可以使用nuitka --plugin-list
來查看。 - –disable-console 在運(yùn)行打包后的程序時(shí),不會(huì)彈出控制臺(tái),而是直接運(yùn)行GUI程序。
手動(dòng)修復(fù)選項(xiàng)
打包程序往往并不是一次就能夠打包成功的,常常會(huì)出現(xiàn)分析不出一部分的引用關(guān)系,忽略了一些數(shù)據(jù)文件等等情況。在這些情況下,我們需要根據(jù)運(yùn)行程序后顯示的報(bào)錯(cuò)信息,使用下面的選項(xiàng)來打出正確的包。
-
–include-package-data= 包含給定軟件包名稱中的數(shù)據(jù)文件,等號(hào)后軟件包名稱。有的時(shí)候Nuitka并不能正確分析出一些Python軟件包所需要使用的數(shù)據(jù)文件,在運(yùn)行程序時(shí)提示FileNotFoundError等錯(cuò)誤,此時(shí)就需要使用該選項(xiàng)。如:
--include-package-data=ultralytics
-
–include-data-files= 按文件名包含數(shù)據(jù)文件,等號(hào)后的格式為<SRC=DEST>。SRC指的是文件夾的路徑,DEST指的是文件夾相對(duì)于打包結(jié)果的路徑,其中DEST只能使用相對(duì)路徑。如:
--include-data-files=/Users/admin/Downloads/yolov5n.pt=./yolov5n.pt
-
–include-data-dir= 包含文件夾中的數(shù)據(jù)文件,等號(hào)后的格式為<SRC=DEST>。使用方法與
--include-data-files=
相同。
Windows 獨(dú)占選項(xiàng)
- –windows-icon-from-ico= 為打包后的可執(zhí)行文件添加圖標(biāo),等號(hào)后跟圖標(biāo)文件路徑。
值得注意的是,圖標(biāo)的格式也可以不是.ico,只需要安裝過imageio包,Nuitka便可以自動(dòng)將圖片轉(zhuǎn)換為.ico格式。
MacOS獨(dú)占選項(xiàng)
- –macos-create-app-bundle 創(chuàng)建應(yīng)用程序(.app),而不是Unix可執(zhí)行文件。(截至 Nuitka 1.5.3 還是實(shí)驗(yàn)性功能,可用性較低)
- –macos-app-icon= 設(shè)置應(yīng)用程序圖標(biāo),等號(hào)后跟圖標(biāo)文件路徑。同樣,圖標(biāo)的格式也可以不是.icns,只需要安裝過imageio包,Nuitka便可以自動(dòng)將圖片轉(zhuǎn)換為.icns格式。
無需關(guān)注的選項(xiàng)
- –follow-imports 作用是在打包過程中分析程序的引用關(guān)系,將Python主程序引用的包也一并打包。其實(shí)這件事本身很重要,畢竟在大多數(shù)情況下應(yīng)該沒人希望Nuitka只打包一個(gè)Python主程序文件。但是在 --standalone 和 --onefile 下,該選項(xiàng)是強(qiáng)制啟用的,因此不需要額外加上。
- –nofollow-import-to= 作用是在打包過程中忽略指定的Python軟件包。作為入門指南,我不建議使用該選項(xiàng),因?yàn)椴划?dāng)使用會(huì)引入一些難以解決的問題。
實(shí)用命令
python -m nuitka --help # 查看 Nuitka 幫助手冊(cè)
python -m nuitka --plugin-list # 查看 Nuitka 插件列表
舉例
python -m nuitka --standalone --remove-output {your_python_program_name}.py
python -m nuitka --onefile --remove-output {your_python_program_name}.py
python -m nuitka --standalone --disable-console --enable-plugin=pyside6 --remove-output {your_python_GUI_program_name}.py
python -m nuitka --macos-create-app-bundle --disable-console --enable-plugin=pyside6 --remove-output {your_python_GUI_program_name}.py
注意事項(xiàng)
- 官方文檔中提到,相對(duì)于直接使用
nuitka
命令,python -m nuitka
是更好的選擇。
Avoid running the
nuitka
binary, doingpython -m nuitka
will make a 100% sure you are using what you think you are. Using the wrong Python will make it give youSyntaxError
for good code orImportError
for installed modules. That is happening, when you run Nuitka with Python2 on Python3 code and vice versa. By explicitly calling the same Python interpreter binary, you avoid that issue entirely.
- 用于執(zhí)行Nuitka的Python解釋器最好是CPython,即Python解釋器的標(biāo)準(zhǔn)實(shí)現(xiàn)。使用Apple Python等Python解釋器部分功能將受限。
It has to be CPython, Anaconda Python.
You need the standard Python implementation, called “CPython”, to execute Nuitka, because it is closely tied to implementation details of it.
優(yōu)點(diǎn)
- 對(duì)動(dòng)態(tài)鏈接庫(kù)的分析相對(duì)準(zhǔn)確
- 打包生成的軟件占用空間較小
缺點(diǎn)
- 打包時(shí)間相對(duì)較長(zhǎng)
- 有商業(yè)版本,需要收費(fèi)
尾聲
如果您覺得我寫的還不錯(cuò)的話,希望您可以點(diǎn)個(gè)贊,點(diǎn)個(gè)收藏,您的支持對(duì)我來說非常重要!
我熱烈歡迎您轉(zhuǎn)載我的這篇文章,但要求您標(biāo)明作者與出處。文章來源:http://www.zghlxwxcb.cn/news/detail-596496.html
如果文章中存在侵權(quán)之處,也請(qǐng)您告知我,我將及時(shí)修改。文章來源地址http://www.zghlxwxcb.cn/news/detail-596496.html
參考
- Nuitka User Manual — Nuitka the Python Compiler documentation
- Nuitka Github 倉(cāng)庫(kù)
到了這里,關(guān)于Python 打包工具 Nuitka 入門指南的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!