將python程序打包成exe的pyinstaller

將python程序打包成exe

打包成exe需要安裝第三方庫:
pip install pyinstaller
安裝完成,cmd中輸入pyinstaller回車查看是否安裝成功;

注意事項

該庫支持mac,windows的,需要注意的是使用mac打完的包只能在mac上運行,windows打完的包只能在windows運行

快速入門

第一個程序打包
demo8.py

import time

print('我是exe文件按哦')
te=input('請輸入內(nèi)容')
print(te)
time.sleep(3)

在該py文件的目錄下使用cmd輸入:
pyinstaller -D demo8.py
開始執(zhí)行打包,打包完成后目錄會生成build,dist,demo8.spec文件

  1. build是指打包過程中的臨時文件,這個可以刪除不影響
  2. dist是打包完成的項目目錄, 進入后可以看到打包完成的demo8.exe文件,注意這里的文件都是不能刪除的
  3. demo8.spec文件:這個是打包生成后的配置文件,如果打包過程中一些動態(tài)包,或者其他資源沒有加入進來我們可以配置這個文件,使用這個文件進行打包

多文件打包

命令:pyinstaller -D demo8.py -n demo
其中-n的意思是打包后的exe文件名叫什么
-D打包后生成多個文件
上述快速入門使用的就是

單文件打包

命令:pyinstaller -F demo8.py -n demo
命令:pyinstaller -Fw demo8.py -n demo其中的-w就是設(shè)置執(zhí)行后不展示cmd的黑窗口;

py文件中涉及到其他文件資源文件如何加載使用?

注意:如果是多文件打包,不會報錯故不用處理,單文件打包會出現(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('請輸入內(nèi)容')
print(te)
time.sleep(3)

執(zhí)行多文件打包運行:打完包后執(zhí)行發(fā)現(xiàn)報錯了,說找不到./xuxiriji.md文件,要將該文件和demo8.py文件放在一起即可;
執(zhí)行單文件打包運行:如果寫的相對路徑還好,建議寫成:

mm=os.path.dirname(os.path.realpath(sys.argv[0]))# 文件存放的目錄
sd=os.getcwd()# 文件存放的目錄

這樣我們的目錄就能保證文件可以找得到,將第三方資源文件放在和exe文件相同地方即可;有效的解決文件找不到的問題:
不能使用下方這種錯誤的方式

import os
import sys
ss=os.path.realpath(sys.path[0])# 獲取的是項目執(zhí)行目錄
base=os.path.dirname(os.path.abspath(__file__))# 獲取的是項目執(zhí)行目錄

這個獲取的項目執(zhí)行目錄!

官網(wǎng)的實例

在官網(wǎng)也提供了解決該場景的問題
演示代碼

import os
import sys
if getattr(sys,'frozen',False):
    Base=os.path.dirname(sys.executable) # 文件執(zhí)行時的路徑
else:
    Base=os.path.dirname(os.path.abspath(__file__))# 文件所在的路徑

動態(tài)加載第三方包

演示代碼
demo8.py

import time
import importlib

print('dddddd')
card=importlib.import_module('headers_from.dd')
print(card.mm)
time.sleep(5)

我們再使用剛才的命令打包執(zhí)行,結(jié)果會發(fā)現(xiàn)報錯,說第五行找不到該包
Failed to execute script 'demo8' due to unhandled exception!
,所以解決此問題我們可以修改打包的配置文件
也就是demo8.spec文件
打開這個文件
在這個字段中增加要添加的第三方庫: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í)行打包啦,注意此時就不需要加-D或者-F了;
生成出來的icon設(shè)置,-i指定圖標目錄即可
其他命令詳見pyinstaller的官方文檔

如果想讓其他資源(圖片,視頻,文檔等)也打包在exe中可以設(shè)置資源,但這也就會造成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')

上面還有個變量block_cipher,主要是防止exe被反編譯。
可以設(shè)置

block_cipher = pyi_crypto.PyiBlockCipher(key='123456789')

加密的詳細查看
Python 中如何安全地進行編譯和反編譯? (qq.com)

更多配置參考官網(wǎng):Using Spec Files — PyInstaller 5.4.1 documentation

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容