將python程序打包成exe的pyinstaller

將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文件

  1. build是指打包過(guò)程中的臨時(shí)文件锌仅,這個(gè)可以刪除不影響
  2. dist是打包完成的項(xiàng)目目錄, 進(jìn)入后可以看到打包完成的demo8.exe文件墙贱,注意這里的文件都是不能刪除的
  3. 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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市稍算,隨后出現(xiàn)的幾起案子典尾,更是在濱河造成了極大的恐慌,老刑警劉巖糊探,帶你破解...
    沈念sama閱讀 223,002評(píng)論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钾埂,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡侧到,警方通過(guò)查閱死者的電腦和手機(jī)勃教,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)匠抗,“玉大人故源,你說(shuō)我怎么就攤上這事」常” “怎么了绳军?”我有些...
    開封第一講書人閱讀 169,787評(píng)論 0 365
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)矢腻。 經(jīng)常有香客問我门驾,道長(zhǎng),這世上最難降的妖魔是什么多柑? 我笑而不...
    開封第一講書人閱讀 60,237評(píng)論 1 300
  • 正文 為了忘掉前任奶是,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘聂沙。我一直安慰自己秆麸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評(píng)論 6 398
  • 文/花漫 我一把揭開白布及汉。 她就那樣靜靜地躺著沮趣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪坷随。 梳的紋絲不亂的頭發(fā)上房铭,一...
    開封第一講書人閱讀 52,821評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音温眉,去河邊找鬼缸匪。 笑死,一個(gè)胖子當(dāng)著我的面吹牛芍殖,可吹牛的內(nèi)容都是我干的豪嗽。 我是一名探鬼主播谴蔑,決...
    沈念sama閱讀 41,236評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼豌骏,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了隐锭?” 一聲冷哼從身側(cè)響起窃躲,我...
    開封第一講書人閱讀 40,196評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎钦睡,沒想到半個(gè)月后蒂窒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,716評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡荞怒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,794評(píng)論 3 343
  • 正文 我和宋清朗相戀三年洒琢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片褐桌。...
    茶點(diǎn)故事閱讀 40,928評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡衰抑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出荧嵌,到底是詐尸還是另有隱情呛踊,我是刑警寧澤,帶...
    沈念sama閱讀 36,583評(píng)論 5 351
  • 正文 年R本政府宣布啦撮,位于F島的核電站谭网,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏赃春。R本人自食惡果不足惜愉择,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,264評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧锥涕,春花似錦要拂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至窿春,卻和暖如春拉一,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背旧乞。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工蔚润, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人尺栖。 一個(gè)月前我還...
    沈念sama閱讀 49,378評(píng)論 3 379
  • 正文 我出身青樓嫡纠,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親延赌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子除盏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,937評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容