PyInstaller是一個(gè)非常實(shí)用的Python庫,可以將Python代碼打包成可執(zhí)行文件,方便用戶在不安裝Python環(huán)境的情況下直接運(yùn)行Python程序。本文將為大家介紹PyInstaller的簡(jiǎn)介、使用方法、高級(jí)用法、全部參數(shù)詳解、spec文件詳解以及PyInstaller的原理實(shí)現(xiàn)。
- PyInstaller簡(jiǎn)介
PyInstaller是一個(gè)Python庫,可以將Python應(yīng)用程序轉(zhuǎn)換為獨(dú)立的可執(zhí)行文件。PyInstaller支持跨平臺(tái),可以在Windows、Linux和MacOS上生成可執(zhí)行文件。
PyInstaller會(huì)分析Python程序,并將程序打包成一個(gè)完整的可執(zhí)行文件,包括所有依賴項(xiàng)。此外,PyInstaller可以自動(dòng)檢測(cè)Python依賴庫,并將其打包到可執(zhí)行文件中。
- PyInstaller使用方法
安裝PyInstaller
要使用PyInstaller,需要先安裝它??梢允褂萌缦旅钤诿钚兄邪惭bPyInstaller:
pip install pyinstaller
打包Python程序
在PyInstaller中,使用如下命令將Python程序打包為可執(zhí)行文件:
pyinstaller yourscript.py
其中 yourscript.py 是你要打包的Python腳本。
執(zhí)行上述命令后,PyInstaller會(huì)自動(dòng)分析你的Python程序,并將其打包成一個(gè)可執(zhí)行文件,并將依賴項(xiàng)打包到可執(zhí)行文件中。
要運(yùn)行打包生成的可執(zhí)行文件,只需要在命令行中輸入以下命令:
./yourscript
打包為單個(gè)文件
默認(rèn)情況下,PyInstaller生成的可執(zhí)行文件包含多個(gè)文件。如果需要將所有文件打包成一個(gè)單獨(dú)的可執(zhí)行文件,可以使用如下命令:
pyinstaller --onefile yourscript.py
這個(gè)命令將生成一個(gè)單獨(dú)的可執(zhí)行文件 yourscript,該文件包含Python程序和所有依賴項(xiàng)。
打包為控制臺(tái)應(yīng)用程序
如果你的Python程序是一個(gè)控制臺(tái)應(yīng)用程序,可以使用如下命令將其打包為控制臺(tái)應(yīng)用程序:
pyinstaller --console yourscript.py
這個(gè)命令將生成一個(gè)控制臺(tái)應(yīng)用程序 yourscript,該程序會(huì)在命令行窗口中運(yùn)行。
打包為GUI應(yīng)用程序
如果你的Python程序是一個(gè)GUI應(yīng)用程序,可以使用如下命令將其打包為GUI應(yīng)用程序:
pyinstaller --windowed --icon=youricon.ico yourscript.py
其中,--windowed參數(shù)表示生成無控制臺(tái)窗口應(yīng)用程序,--icon參數(shù)表示定義程序圖標(biāo)。這個(gè)命令將生成一個(gè)GUI應(yīng)用程序 yourscript,該程序不會(huì)在命令行窗口中運(yùn)行。
- PyInstaller高級(jí)用法
設(shè)置環(huán)境變量
如果你的Python程序需要使用環(huán)境變量,可以通過設(shè)置PyInstaller的環(huán)境變量來實(shí)現(xiàn)。例如,如果你的Python程序需要使用MY_VAR環(huán)境變量,可以使用如下命令:
pyinstaller --env MY_VAR=value yourscript.py
排除依賴項(xiàng)
在打包Python程序時(shí),有些依賴項(xiàng)可能會(huì)導(dǎo)致打包失敗或生成的可執(zhí)行文件發(fā)生錯(cuò)誤。在這種情況下,你可以使用如下命令排除某些依賴項(xiàng):
pyinstaller --exclude-module=module_name yourscript.py
其中,module_name是你要排除的模塊名。
自定義打包選項(xiàng)
如果PyInstaller提供的默認(rèn)打包選項(xiàng)不能滿足你的需求,你可以通過spec文件來自定義打包選項(xiàng)。spec文件是一個(gè)Python腳本,其中包含了打包選項(xiàng)和其他必要信息。使用如下命令生成spec文件:
pyinstaller --name=yourappname yourscript.py --specpath=.
然后,你可以編輯spec文件來自定義打包選項(xiàng)。最后,使用如下命令將Python程序打包為可執(zhí)行文件:
pyinstaller yourappname.spec
- PyInstaller全部參數(shù)詳解
PyInstaller的命令行選項(xiàng)非常多,下面列出一些最常用的選項(xiàng):
--name:指定可執(zhí)行文件的名稱。
--onefile:將所有文件打包成一個(gè)單獨(dú)的可執(zhí)行文件。
--console:生成控制臺(tái)應(yīng)用程序。
--windowed:生成無控制臺(tái)窗口應(yīng)用程序。
--icon:指定可執(zhí)行文件的圖標(biāo)。
--exclude-module:排除某個(gè)模塊。
--add-data:將文件或目錄添加到可執(zhí)行文件中。
--debug:?jiǎn)⒂谜{(diào)試信息。
--log-level:設(shè)置日志級(jí)別。
--clean:清理臨時(shí)文件和緩存。
--specpath:指定spec文件的輸出目錄。
- spec文件詳解
spec文件是PyInstaller的配置文件,它包含了打包Python程序所需的所有信息。在使用PyInstaller打包Python程序時(shí),默認(rèn)會(huì)生成一個(gè)spec文件。
spec文件是一個(gè)Python腳本,其中包含了打包選項(xiàng)和其他必要信息。你可以編輯spec文件來自定義打包選項(xiàng)。例如,可以使用如下代碼指定可執(zhí)行文件的名稱:
a = Analysis(['yourscript.py'],
pathex=['/path/to/script_dir'],
binaries=[],
datas=[],
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=None,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=None)
exe = EXE(pyz,
a.scripts,
name='yourappname',
exclude_binaries=True,
exclude_dll=False,
icon='youricon.ico',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
upx_includes=[],
runtime_tmpdir=None,
console=True )
其中,name='yourappname'指定了可執(zhí)行文件的名稱。
- PyInstaller的原理實(shí)現(xiàn)
PyInstaller的原理是將Python程序轉(zhuǎn)換為C語言代碼,并將C語言代碼編譯成可執(zhí)行文件。具體來說,PyInstaller會(huì)將Python程序分析為一個(gè)抽象語法樹(AST),然后將AST轉(zhuǎn)換為C語言代碼。
PyInstaller會(huì)使用PyInstaller bootloader來啟動(dòng)Python解釋器和主程序。啟動(dòng)過程中,PyInstaller會(huì)從可執(zhí)行文件中讀取所有依賴項(xiàng),并將其加載到內(nèi)存中。然后,PyInstaller會(huì)將Python腳本加載到內(nèi)存中,并執(zhí)行Python程序。
結(jié)論
本文介紹了PyInstaller的簡(jiǎn)介、使用方法、高級(jí)用法、全部參數(shù)詳解、spec文件詳解以及PyInstaller的原理實(shí)現(xiàn)。PyInstaller是一個(gè)非常方便的Python庫,可以將Python程序打包成可執(zhí)行文件,并將依賴項(xiàng)打包到可執(zhí)行文件中,方便用戶在不安裝Python環(huán)境的情況下直接運(yùn)行Python程序。
windows系統(tǒng)conda環(huán)境當(dāng)用pyinstaller 打包的是往往會(huì)報(bào)這個(gè)錯(cuò):
SystemExit: The 'pathlib' package is an obsolete backport of a standard library package and is incompatible with PyInstaller. Please remove this package (located in d:\ProgramData\anaconda3\lib\site-packages) using conda remove then try again.
看看 是讓你移除pathlib,用conda remove,我看到一個(gè)博主也是conda remove pathlib,但是我勸大家不要,搞不好會(huì)把conda 環(huán)境搞壞掉。
用pip uninstall pathlib 既可以解決問題。