參數(shù) | 說明 |
---|---|
-F | 產(chǎn)生單個(gè)的可執(zhí)行文件 |
-D | 產(chǎn)生一個(gè)目錄(包含多個(gè)文件)作為可執(zhí)行程序 |
-a | 不包含 Unicode 字符集支持 |
-d | debug 版本的可執(zhí)行文件 |
-w | 指定程序運(yùn)行時(shí)不顯示命令行窗口(僅對(duì) Windows 有效) |
-c | 指定使用命令行窗口運(yùn)行程序(僅對(duì) Windows 有效) |
-o | 指定 spec 文件的生成目錄。如果沒有指定,則默認(rèn)使用當(dāng)前目錄來生成 spec 文件 |
-p | 設(shè)置 Python 導(dǎo)入模塊的路徑(和設(shè)置 PYTHONPATH 環(huán)境變量的作用相似)。也可使用路徑分隔符(Windows 使用分號(hào),Linux 使用冒號(hào))來分隔多個(gè)路徑 |
-n | 指定項(xiàng)目(產(chǎn)生的 spec)名字。如果省略該選項(xiàng),那么第一個(gè)腳本的主文件名將作為 spec 的名字 |
打包一個(gè)帶自定義icon的exe可執(zhí)行文件
我們可以去這里下載icon文件:
https://www.iconfont.cn/
可以去這里將圖片轉(zhuǎn)化為icon文件:
https://www.bitbug.net/
然后,用一下命令可以自定義exe圖標(biāo):
(env_test) F:\PythonCool\pyinstaller>pyinstaller -F -i icon.ico 測(cè)試.py
成功后,我們可以看到圖標(biāo)變成了我們自定義的這個(gè):
打包去掉命令行彈窗的exe可執(zhí)行文件
如果我們是有GUI的程序,想在啟動(dòng)的時(shí)候去掉命令行窗口,那么可以用以下指令進(jìn)行打包,這里以tkinter
內(nèi)置GUI庫(kù)為例展示:
# 測(cè)試.py import tkinter top = tkinter.Tk() # 進(jìn)入消息循環(huán) top.mainloop()
以上測(cè)試代碼,如果用初體驗(yàn)中的方式,在GUI界面出現(xiàn)的同時(shí)也會(huì)出現(xiàn)命令行彈窗,我們想去掉命令行彈窗可以:
(env_test) F:\PythonCool\pyinstaller>pyinstaller -F -w -i icon.ico 測(cè)試.py
雙擊打包后的exe
文件,可以看到只會(huì)出現(xiàn)GUI界面,命令行窗口并沒有出現(xiàn)。
所謂帶配置文件打包,這里是指打包的時(shí)候除了py文件、依賴的庫(kù)之外,還存在需要引用的其他資源文件。直接用以上方式打包的時(shí)候,這些資源是無法被打進(jìn)包的,我們需要進(jìn)行修改打包時(shí)的spec
文件來實(shí)現(xiàn)。
spec文件是告訴Pyinstaller怎么打包py文件,比如路徑、資源、動(dòng)態(tài)庫(kù)、隱式調(diào)用的模塊等等。一般來說,我們不需要對(duì)它進(jìn)行修改…
這里我用此前《詞云繪制小工具》的案例來進(jìn)行介紹。
我們直接用打包進(jìn)階體驗(yàn)中的命令可以進(jìn)行成功打包,不過這里我們發(fā)現(xiàn)有兩個(gè)問題:①包體很大,比此前案例里大了10倍左右;②啟動(dòng)exe文件的時(shí)候報(bào)錯(cuò)了。
關(guān)于包體較大的情況,可以試著創(chuàng)建虛擬環(huán)境,然后只安裝程序里需要調(diào)用的庫(kù)即可,這里只簡(jiǎn)單介紹:
# 創(chuàng)建虛擬環(huán)境 conda create -n your_env_name python=3.8.10 # 啟動(dòng)虛擬環(huán)境 activate your_env_name
關(guān)于啟動(dòng)報(bào)錯(cuò)的情況,由于比較復(fù)雜,我們一步一步來看:
①由于無命令行彈窗,無法查看到具體的報(bào)錯(cuò),這里先去帶命令行窗口形式看下報(bào)錯(cuò)信息,我們看報(bào)錯(cuò)如下:
提示缺少這個(gè)文件,我們可以在打包生成的詞云繪制工具.spec
配置文件里將這個(gè)資源放上
# -*- mode: python ; coding: utf-8 -*- # 詞云繪制工具.spec block_cipher = None a = Analysis(['詞云繪制工具.py'], pathex=['F:\\PythonCool\\pyinstaller'], binaries=[], datas=[], # 這里帶上資源文件地址 hiddenimports=[], # 動(dòng)態(tài)引入的庫(kù)或模塊 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, a.binaries, a.zipfiles, a.datas, [], name='詞云繪制工具', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=[], runtime_tmpdir=None, console=True , icon='icon.ico')
通過在wordcloud
模塊目錄里查到了stopwords
文件,我們將其放到data中。
datas=[('C:\\Users\\Gdc\\anaconda3\\envs\\env_test\\Lib\\site-packages\\wordcloud\\stopwords','wordcloud')],
前者是資源文件在本機(jī)的位置,后者為打包后文件調(diào)用的相對(duì)路徑,編輯好spec
文件后,通過以下命令進(jìn)行打包:
(env_test) F:\PythonCool\pyinstaller>pyinstaller -D 詞云繪制工具.spec
好吧,還有一些文件未被打進(jìn)包,所以又出現(xiàn)同樣的問題了。所以,我們是需要把全部的資源文件都加到spec文件里的data中。
我們找到全部的資源文件全部加上吧,然后再執(zhí)行打包命令。
datas=[('C:\\Users\\Gdc\\anaconda3\\envs\\env_test\\Lib\\site-packages\\stylecloud\\static','stylecloud\\static'), ('C:\\Users\\Gdc\\anaconda3\\envs\\env_test\\Lib\\site-packages\\wordcloud\\stopwords','wordcloud'), ('C:\\Users\\Gdc\\anaconda3\\envs\\env_test\\Lib\\site-packages\\jieba\\analyse\\idf.txt','jieba\\analyse'), ('C:\\Users\\Gdc\\anaconda3\\envs\\env_test\\Lib\\site-packages\\jieba\\dict.txt','jieba')]
我們將配置資源打進(jìn)包后可以正常啟動(dòng)exe可執(zhí)行文件了。
但是,又發(fā)現(xiàn)在執(zhí)行詞云繪制的時(shí)候,也會(huì)出現(xiàn)報(bào)錯(cuò)。不過看報(bào)錯(cuò)的情況是提示不存在xx模塊
,那么這是什么情況呢?!
我們找到報(bào)錯(cuò)的地方代碼如下,采用了__import__()
函數(shù)用于動(dòng)態(tài)加載類和函數(shù)palettable
模塊。
def gen_palette(palette: str): """Generates the corresponding palette function from `palettable`.""" palette_split = palette.split(".") palette_name = palette_split[-1] # https://stackoverflow.com/a/6677505 palette_func = getattr( __import__( "palettable.{}".format(".".join(palette_split[:-1])), fromlist=[palette_name], ), palette_name, ) return palette_func
對(duì)于這個(gè)問題,我試過兩種方案,大家可以參考一下。
方案一:在spec文件中hiddenimports中添加動(dòng)態(tài)引用的模塊
hiddenimports=['palettable'], # 動(dòng)態(tài)引入的庫(kù)或模塊
這種情況下,palettable
庫(kù)里也有一些配置文件需要添加到spec文件里的data中
('C:\\Users\\Gdc\\anaconda3\\envs\\env_test\\Lib\\site-packages\\palettable\\colorbrewer\\data','palettable\\colorbrewer\\data')
方案二:修改stylecloud庫(kù)中調(diào)用palettable模塊的代碼部分
import palettable def gen_palette(palette: str): palette_func = getattr(palettable.tableau,'BlueRed_6') return palette_func # """Generates the corresponding palette function from `palettable`.""" # palette_split = palette.split(".") # palette_name = palette_split[-1] # https://stackoverflow.com/a/6677505 # palette_func = getattr( # __import__( # "palettable.{}".format(".".join(palette_split[:-1])), # fromlist=[palette_name], # ), # palette_name, # )
通過第4和5部分,我們用pyinstaller終于成功打包且正常運(yùn)行使用了。
以上就是本次全部?jī)?nèi)容,大家如果遇到打包時(shí)涉及到配置文件的或者隱式調(diào)用的,可以采用這兩個(gè)2技巧進(jìn)行特殊打包!
不過,關(guān)于pyinstaller打包其實(shí)還有更多操作,大家可以多看看官方文檔了解,主要是命令行參數(shù)及spec文件里的配置要點(diǎn)。
到此這篇關(guān)于總結(jié)Pyinstaller打包的高級(jí)用法的文章就介紹到這了,更多相關(guān)Pyinstaller打包內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
標(biāo)簽:佳木斯 盤錦 潮州 湖北 宜昌 西寧 上饒 珠海
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《總結(jié)Pyinstaller打包的高級(jí)用法》,本文關(guān)鍵詞 總結(jié),Pyinstaller,打包,的,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。