將python程序打包成exe
打包成exe需要安裝第三方庫(kù):
pip install pyinstaller
安裝完成,cmd中輸入pyinstaller回車查看是否安裝成功毅人;
注意事項(xiàng)
該庫(kù)支持mac,windows的昵仅,需要注意的是使用mac打完的包只能在mac上運(yùn)行隔崎,windows打完的包只能在windows運(yùn)行
快速入門
第一個(gè)程序打包
demo8.py
import time
print('我是exe文件按哦')
te=input('請(qǐng)輸入內(nèi)容')
print(te)
time.sleep(3)
在該py文件的目錄下使用cmd輸入:
pyinstaller -D demo8.py
開始執(zhí)行打包袒哥,打包完成后目錄會(huì)生成build,dist侯谁,demo8.spec文件
- build是指打包過(guò)程中的臨時(shí)文件锌仅,這個(gè)可以刪除不影響
- dist是打包完成的項(xiàng)目目錄, 進(jìn)入后可以看到打包完成的demo8.exe文件墙贱,注意這里的文件都是不能刪除的
- demo8.spec文件:這個(gè)是打包生成后的配置文件技扼,如果打包過(guò)程中一些動(dòng)態(tài)包,或者其他資源沒有加入進(jìn)來(lái)我們可以配置這個(gè)文件嫩痰,使用這個(gè)文件進(jìn)行打包
多文件打包
命令:pyinstaller -D demo8.py -n demo
其中-n的意思是打包后的exe文件名叫什么
-D打包后生成多個(gè)文件
上述快速入門使用的就是
單文件打包
命令:pyinstaller -F demo8.py -n demo
命令:pyinstaller -Fw demo8.py -n demo其中的-w就是設(shè)置執(zhí)行后不展示cmd的黑窗口;
py文件中涉及到其他文件資源文件如何加載使用剿吻?
注意:如果是多文件打包,不會(huì)報(bào)錯(cuò)故不用處理串纺,單文件打包會(huì)出現(xiàn)執(zhí)行找不到資源文件問題丽旅,如下方代碼
demo8.py
import time
with open('./xuxiriji.md','r',encoding='utf-8') as rf:
ss=rf.read()
print(ss)
print('我是exe文件按哦')
te=input('請(qǐng)輸入內(nèi)容')
print(te)
time.sleep(3)
執(zhí)行多文件打包運(yùn)行:打完包后執(zhí)行發(fā)現(xiàn)報(bào)錯(cuò)了椰棘,說(shuō)找不到./xuxiriji.md文件,要將該文件和demo8.py文件放在一起即可榄笙;
執(zhí)行單文件打包運(yùn)行:如果寫的相對(duì)路徑還好邪狞,建議寫成:
mm=os.path.dirname(os.path.realpath(sys.argv[0]))# 文件存放的目錄
sd=os.getcwd()# 文件存放的目錄
這樣我們的目錄就能保證文件可以找得到,將第三方資源文件放在和exe文件相同地方即可茅撞;有效的解決文件找不到的問題:
不能使用下方這種錯(cuò)誤的方式
import os
import sys
ss=os.path.realpath(sys.path[0])# 獲取的是項(xiàng)目執(zhí)行目錄
base=os.path.dirname(os.path.abspath(__file__))# 獲取的是項(xiàng)目執(zhí)行目錄
這個(gè)獲取的項(xiàng)目執(zhí)行目錄帆卓!
官網(wǎng)的實(shí)例
在官網(wǎng)也提供了解決該場(chǎng)景的問題
演示代碼
import os
import sys
if getattr(sys,'frozen',False):
Base=os.path.dirname(sys.executable) # 文件執(zhí)行時(shí)的路徑
else:
Base=os.path.dirname(os.path.abspath(__file__))# 文件所在的路徑
動(dòng)態(tài)加載第三方包
演示代碼
demo8.py
import time
import importlib
print('dddddd')
card=importlib.import_module('headers_from.dd')
print(card.mm)
time.sleep(5)
我們?cè)偈褂脛偛诺拿畲虬鼒?zhí)行,結(jié)果會(huì)發(fā)現(xiàn)報(bào)錯(cuò)米丘,說(shuō)第五行找不到該包
Failed to execute script 'demo8' due to unhandled exception!
剑令,所以解決此問題我們可以修改打包的配置文件
也就是demo8.spec文件
打開這個(gè)文件
在這個(gè)字段中增加要添加的第三方庫(kù):hiddenimports
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(
['demo8.py'],
pathex=[],
binaries=[],
datas=[],
hiddenimports=[
"headers_from.dd",
],
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='demo8',
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,
)
再次打包使用的命令pyinstall demo8.spec回車執(zhí)行打包啦,注意此時(shí)就不需要加-D或者-F了拄查;
生成出來(lái)的icon設(shè)置吁津,-i指定圖標(biāo)目錄即可
其他命令詳見pyinstaller的官方文檔
如果想讓其他資源(圖片,視頻,文檔等)也打包在exe中可以設(shè)置資源,但這也就會(huì)造成exe很大
# -*- mode: python -*-
block_cipher = None
resources = (("inspurer.db", "."), ("dlib_face_recognition_resnet_model_v1.dat", "."),
("shape_predictor_68_face_landmarks.dat", "."), ("close_logcat.png", ".")
, ("open_logcat.png", "."), ("finish_register.png", "."), ("new_register.png", ".")
, ("start_punchcard.png", "."), ("end_puncard.png", "."), ("index.png", "."))
a = Analysis(['workAttendanceSystem.py'],
pathex=['C:\\Users\\lenovo\\Desktop\\test\\python'],
binaries=[],
datas=resources,
hiddenimports=[],
hookspath=[],
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,
[],
exclude_binaries=True,
name='workAttendanceSystem',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=True )
coll = COLLECT(exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
name='workAttendanceSystem')
上面還有個(gè)變量block_cipher,主要是防止exe被反編譯堕扶。
可以設(shè)置
block_cipher = pyi_crypto.PyiBlockCipher(key='123456789')
加密的詳細(xì)查看
Python 中如何安全地進(jìn)行編譯和反編譯碍脏? (qq.com)
更多配置參考官網(wǎng):Using Spec Files — PyInstaller 5.4.1 documentation