Python使用pyinstaller打包含有g(shù)ettext?locales語言環(huán)境的項(xiàng)目(推薦)
問題
如何使用 pyinstaller 打包使用了 gettext 本地化的項(xiàng)目,最終只生成一個(gè) exe 文件
起因
最近在用 pyhton 做一個(gè)圖片處理的小工具,順便接觸了一下 gettext,用來實(shí)現(xiàn)本地化化中英文轉(zhuǎn)換。項(xiàng)目主要結(jié)構(gòu)如下:
. |--src # 源碼 | |--package1 | |--package2 | |--locales # 本地化文件 | | |--en # 英文 | | | |--LC_MESSAGES | | | |--en.mo | | |--zh # 中文 | | |--LC_MESSAGES | | |--en.mo | |--GUI.py # 界面 | |--main.py # 主程序
直接使用 pyinstaller -F src\main.py 命令進(jìn)行打包,打包后運(yùn)行在 dist 文件夾中生成的 main.exe 會報(bào)錯(cuò)。原因是 gettext 找不到本地化文件。但如果試著將 locales 文件夾復(fù)制到 main.exe 的目錄下程序能正常運(yùn)行,說明 pyinstaller 在打包時(shí)不會將 locales 文件夾打包進(jìn)去。
復(fù)制 locales 文件夾到可執(zhí)行文件目錄下固然可以運(yùn)行,但這樣用起來會很麻煩。
解決方案
?目標(biāo)是將 locales 目錄一起打包進(jìn) exe 文件中,查閱 pyinstaller 的官方文檔,了解到執(zhí)行之前的 pyinstaller -F src\\main.py 命令會在目錄下生成一個(gè) .spec 文件,pyinstaller 通過該文件的內(nèi)容來構(gòu)建應(yīng)用程序。
the first thing PyInstaller does is to build a spec (specification) file myscript.spec. That file is stored in the --specpath directory, by default the current directory.
The spec file tells PyInstaller how to process your script. It encodes the script names and most of the options you give to the pyinstaller command. The spec file is actually executable Python code. PyInstaller builds the app by executing the contents of the spec file.
使用記事本打開,.spec 文件里面大致長這樣(來自官方例子)
block_cipher = None
a = Analysis(['minimal.py'],
pathex=['/Developer/PItests/minimal'],
binaries=None,
datas=None,
hiddenimports=[],
hookspath=None,
runtime_hooks=None,
excludes=None,
cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,... )
coll = COLLECT(...)其中,Analysis 里面有個(gè) datas 參數(shù),用于存放非二進(jìn)制文件,也就是我們想讓程序包含的靜態(tài)文件。我們只要把 locales 目錄填到這里面打包就會添加進(jìn)去。當(dāng)然不是填一個(gè)路徑就好了,data 的格式如下:
--add-data <SRC;DEST or SRC:DEST>
SRC 就是未打包前的文件路徑,DEST 是打包后文件的路徑。以我的項(xiàng)目為例,打包前 locales 在 src/locales,打包后我想講里面的文件放到臨時(shí)目錄的根目錄下就填 ./locales,臨時(shí)目錄是什么后面講。于是在我的 .spec文件里 datas 處就寫成 datas=[("src/locales","./locales")]。如果有多個(gè)路徑就以這樣形式 datas=[(src1, dest1), (src2, dest2), ...]就OK。
這樣打包部分的配置就改完了,不要急,還要改下源代碼。exe 文件在運(yùn)行時(shí)會生成一個(gè)臨時(shí)目錄,我們之前 datas 中的文件也會在該目錄下??纯茨愕脑创a,如果調(diào)用資源用的是相對路徑,那讀取的是 exe 文件當(dāng)前的目錄,必然是找不到資源的。所以要把源碼中相對路徑改成臨時(shí)目錄的絕對路徑。
sys 中的 _MEIPASS 屬性存儲了臨時(shí)目錄路徑,直接獲取即可。如果程序運(yùn)行環(huán)境是打包后的,那么在 sys 中會添加一個(gè) frozen 屬性,通過能不能獲取 frozen 屬性可以判斷當(dāng)前環(huán)境是打包前還是打包后,具體詳情請查閱 pyinstaller 官方文檔(末尾有地址)。打包前就不需要獲取臨時(shí)目錄路徑了,直接用文件所在目錄路徑就行。
注意:打包后環(huán)境 file 屬性不生效
import sys
import os
if getattr(sys, 'frozen', None):
dir = sys._MEIPASS
else:
dir = os.path.dirname(__file__)獲取路徑 dir,可以使用 os.path.join() 來拼接路徑,把源碼中調(diào)用 datas 中資源地方的路徑改成 os.path.join(dir, <打包后相對路徑>)
如我的項(xiàng)目中原來的 './locales' 處就變成了 os.path.join(dir, 'locales')
最后一步,打包!不要再輸之前的命令了,要使用改過之后的 .spec 文件進(jìn)行打包,輸入 pyinstaller -F 文件名.spec 就完成了。
參考資料
pyinstaller 文檔:Using Spec Files
pyinstaller 文檔:Run-time Information
到此這篇關(guān)于Python使用pyinstaller打包含有g(shù)ettext locales語言環(huán)境的項(xiàng)目的文章就介紹到這了,更多相關(guān)Python打包含有g(shù)ettext locales語言環(huán)境的項(xiàng)目內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python大數(shù)據(jù)之從網(wǎng)頁上爬取數(shù)據(jù)的方法詳解
這篇文章主要介紹了Python大數(shù)據(jù)之從網(wǎng)頁上爬取數(shù)據(jù)的方法,結(jié)合實(shí)例形式詳細(xì)分析了Python爬蟲爬取網(wǎng)頁數(shù)據(jù)的相關(guān)操作技巧,需要的朋友可以參考下2019-11-11
python3.5基于TCP實(shí)現(xiàn)文件傳輸
這篇文章主要為大家詳細(xì)介紹了python3.5基于TCP實(shí)現(xiàn)文件傳輸?shù)拇a,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
python利用OpenCV2實(shí)現(xiàn)人臉檢測
這篇文章主要為大家詳細(xì)介紹了python利用OpenCV2實(shí)現(xiàn)人臉檢測,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12
python使用knn實(shí)現(xiàn)特征向量分類
這篇文章主要為大家詳細(xì)介紹了python使用knn實(shí)現(xiàn)特征向量分類,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12
詳解python uiautomator2 watcher的使用方法
這篇文章主要介紹了python uiautomator2 watcher的使用方法,該方是基于uiautomator2如下版本進(jìn)行驗(yàn)證,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下2019-09-09
一文帶你探索Python中15個(gè)常見的魔術(shù)方法
在Python中,特殊方法(也稱為魔術(shù)方法)是由Python解釋器自動調(diào)用的,我們不需要手動調(diào)用它們,本文小編為大家整理了15個(gè)常見特殊方法的實(shí)現(xiàn),希望對大家有所幫助2024-01-01
Python使用PyMuPDF實(shí)現(xiàn)添加PDF水印
在日常工作中,我們經(jīng)常需要對PDF文件進(jìn)行處理,其中一項(xiàng)常見的需求是向PDF文件添加水印,本文將介紹如何使用Python編程語言和PyMuPDF庫在PDF文件中添加水印,感興趣的可以了解一下2023-08-08

