【前言】:我們?cè)陂_發(fā)完一個(gè)小項(xiàng)目后,想要把項(xiàng)目發(fā)布出來給別人用。通常都會(huì)把代碼打包成exe后再給別人,而不是讓別人去安裝運(yùn)行環(huán)境再跑裸代碼。本文就是介紹如何使用pyinstaller這個(gè)工具將python帶包成可直接運(yùn)行的exe。
▍概述
在介紹pyinstaller之前,先簡單介紹下其它幾個(gè)可以用于打包python代碼的工具:
-
cx_Freeze:可以將Python腳本轉(zhuǎn)換為獨(dú)立的可執(zhí)行文件,支持多個(gè)平臺(tái)。
-
PyInstaller:可以將Python腳本(或模塊)轉(zhuǎn)換為單個(gè)可執(zhí)行文件或目錄,支持多個(gè)平臺(tái)。
-
PyOxidizer:功能類似于PyInstaller,但它可以生成自包含的二進(jìn)制文件,可以跨平臺(tái)使用。
-
Py2exe:僅適用于Windows平臺(tái),可以將Python腳本轉(zhuǎn)換為.exe可執(zhí)行文件。
Pyinstaller打包代碼的步驟有:
-
使用pip install pyinstaller命令安裝pyinstaller庫。
-
pyinstaller提供兩種打包方式;
方式一: 在cmd終端進(jìn)入要打包的Python文件所在目錄,使用pyinstaller xxx.py命令打包代碼。
方式二: 在cmd終端進(jìn)入要打包的Python文件所在目錄,使用pyi-makespec xxx.py命令生成spec文件,然后對(duì)spec需要修改的區(qū)域做修改,再使用pyinstaller xxx.spec命令打包代碼。
-
使用pyinstaller打包成功之后,產(chǎn)生兩個(gè)文件夾:
build文件夾:這是打包過程中臨時(shí)文件的存放位置。這些文件包括 Python 源代碼、打包腳本和其他一些中間文件。在成功打包應(yīng)用程序后,該目錄可以被安全地刪除。
dist文件夾:這是最終生成的可執(zhí)行文件及其依賴項(xiàng)的存放位置。
▍方式一:命令行直接打包
使用命令行打包通常適用于簡單的項(xiàng)目,不需要復(fù)雜的配置或自定義設(shè)置,也無需頻繁重復(fù)打包的情況;假設(shè)我們的python代碼如下,文件名為demo.py。
#demo.py
import os
path=os.getcwd()
print(f'當(dāng)前文件路徑:{path}')
os.system('pause')
打包步驟:
1. 在cmd終端中進(jìn)入demo.py文件的所在目錄。
2. 終端執(zhí)行:pyinstaller -F demo.py
指令解釋:
pyinstaller
[-F/-D] # [產(chǎn)生當(dāng)個(gè)可執(zhí)行文件/產(chǎn)生一個(gè)目錄(包含多個(gè)文件)作為可執(zhí)行文件]
[-w/-c] # [去掉命令行彈窗/顯示命令行彈窗]
-i icon.ico # 指定exe顯示圖標(biāo)
demo.py #打包的python文件
結(jié)果:
打包完成后在demo.py文件所在目錄下生成build和dist兩個(gè)文件夾,dist目錄下的demo.exe即為我們打包后的可執(zhí)行文件。點(diǎn)擊demo.exe文件彈出小黑窗即為打包成功。
▍方式二:使用spec打包
spec文件打包適用于更大規(guī)模、更復(fù)雜的項(xiàng)目,以及需要自定義配置和頻繁重復(fù)打包的時(shí)候使用;需要使用 .spec 文件進(jìn)行打包的情況有:
-
有數(shù)據(jù)文件需要一起打包
-
把動(dòng)態(tài)鏈接庫一起打包
-
添加運(yùn)行時(shí)選項(xiàng)
-
想要生成多個(gè)可執(zhí)行程序,公共的模塊分割出來給其他調(diào)用
假設(shè)我們的項(xiàng)目文件結(jié)構(gòu)如下圖所示。
PackingExe
|_ core
|_ __init__.py
|_ dict.txt
|_ demo.py
demo.py文件
def resource_path(relative_path):
""" 運(yùn)行exe時(shí)獲取資源文件的絕對(duì)路徑"""
base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__)))
return os.path.join(base_path, relative_path)
def main():
print(f'當(dāng)前文件路徑:{os.getcwd()}')
abs_path = resource_path('core/dict.txt')
with open(abs_path, 'r', encoding='utf-8') as file:
content = file.readline()
print(content)
os.system('pause')
if __name__ == "__main__":
main()
此處解釋一下資源路徑函數(shù)(resource_path);當(dāng)exe在運(yùn)行時(shí),會(huì)生成一個(gè)臨時(shí)文件夾,除代碼之外的數(shù)據(jù)資源需要通過sys._MEIPASS訪問臨時(shí)文件夾獲取。
打包步驟:
1. 在終端中進(jìn)入PackingExe目錄。
2. 生成spec文件:pyi-makespec -F demo.py # 生成apec文件,支持-F,--key等參數(shù),不支持--upx-dir
3. 修改spec文件
4. 執(zhí)行打包命令:pyinstaller demo.spec # 使用spec文件打包,不支持外部參數(shù)
如何正確編輯spec文件?
spec文件主要包含四個(gè)類:
-
Analysis類:用于分析 Python 模塊之間的依賴關(guān)系,并對(duì)需要的東西進(jìn)行打包。
-
PYZ類:是一個(gè)由多個(gè)Python文件組成的二進(jìn)制文件。PYZ文件內(nèi)部包含整個(gè)程序的代碼和標(biāo)準(zhǔn)庫,以及在腳本代碼中使用的所有第三方庫。
-
EXE類:指定要生成的可執(zhí)行文件的相關(guān)信息,例如名稱、平臺(tái)、圖標(biāo)等。
-
COLLECT類:用于收集所有需要包含在可執(zhí)行文件中的文件,并將其復(fù)制到構(gòu)建目錄中以供打包和部署使用。在-F模式下,是沒有COLLECT類。
用于打包PackingExe項(xiàng)目的spec文件如下:
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(
['demo.py'],
pathex=[],
binaries=[],
datas=[('core\dict.txt', 'core')],
hiddenimports=[],
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False,
)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='demo',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)
結(jié)果:
打包完成后在demo.py文件所在目錄下生成build和dist兩個(gè)文件夾,dist目錄下的demo.exe即為我們打包后的可執(zhí)行文件。點(diǎn)擊demo.exe文件彈出小黑窗即為打包成功。
▍可能打包失敗的原因
-
程序有bug時(shí),打包后的exe會(huì)出現(xiàn)閃退,而不是在小黑窗上報(bào)錯(cuò);
-
用于打包的python解釋器路徑不能有中文或空格;如果必須有可以修改python安裝目錄下的scripts/pyinstaller-script.py文件中的python.exe路徑;
-
最好在py文件首行添加# -*- coding:utf-8 -*-,否則exe容易編碼錯(cuò)誤;
▍學(xué)習(xí)資源推薦
除了上述分享,如果你也喜歡編程,想通過學(xué)習(xí)Python獲取更高薪資,這里給大家分享一份Python學(xué)習(xí)資料。
這里給大家展示一下我進(jìn)的最近接單的截圖
??朋友們?nèi)绻行枰脑?,可?mark>點(diǎn)擊下方鏈接領(lǐng)取或者V掃描下方二維碼聯(lián)系領(lǐng)取,也可以內(nèi)推兼職群哦~
學(xué)好 Python 不論是就業(yè)還是做副業(yè)賺錢都不錯(cuò),但要學(xué)會(huì) Python 還是要有一個(gè)學(xué)習(xí)規(guī)劃。最后大家分享一份全套的 Python 學(xué)習(xí)資料,給那些想學(xué)習(xí) Python 的小伙伴們一點(diǎn)幫助!

2.Python基礎(chǔ)學(xué)習(xí)
01.開發(fā)工具
02.學(xué)習(xí)筆記
03.學(xué)習(xí)視頻
3.Python小白必備手冊(cè)
4.數(shù)據(jù)分析全套資源
5.Python面試集錦
01.面試資料
文章來源:http://www.zghlxwxcb.cn/news/detail-658751.html
02.簡歷模板
文章來源地址http://www.zghlxwxcb.cn/news/detail-658751.html

到了這里,關(guān)于python代碼打包成可執(zhí)行文件(exe)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!