在學《Leanrn Python the Hard Way》時做了一個文字游戲,想要分享給朋友玩。於是便想把程序打包成 .exe 文件,嘗試了py2exe,出了很多問題,花了很多時間查來查去最后還是沒有成功。然后試了pyinstaller,雖然也遇到了一些問題,但終於完成了。
(英文好的建議直接去看官方文檔)
一、安裝及基本操作
Pyinstaller可以使用pip安裝,在命令行下輸入下面這行就可以了。
pip install pyinstaller
如果下載安裝包,那么要注意下載相應的win32/64版本,建議所有的程序都統一成32位或是64位版本,這樣會減少很多問題。
安裝完畢之后,就可以通過以下命令打包了
先轉到主腳本所在的地址,例如:
cd C:\Users\Administrator\projects\tomato
然后執行如下命令:
pyinstaller start.py -F
其中start.py為主腳本,主腳本中調用的模塊文件會被自動打包。第三個參數是操作命令,常用的命令有
-F 打包成單個文件 -D 打包成單個文件夾形式 -c 控制台模式,執行程序會跳出控制台, -w 窗口模式,不會跳出控制台
基礎的命令就這些,程序名和圖標等建議在spec文件中設置。
二、文件調用(音頻,圖片等)
一開始打包時便不清楚文件調用問題,因此文件一旦移動到別處就沒法正常調用。后來看到別人的教程,但這部分也是模棱兩可,讓人理解不了。后來結合官方文檔和別人的教程,終於弄清楚了。
首先在腳本定義一個讀取相對路徑的函數:
1 Import os 2 Import sys 3 4 def resource_path(relative_path): 5 """ 6 定義一個讀取相對路徑的函數 7 """ 8 if hasattr(sys, "_MEIPASS"): 9 base_path = sys._MEIPASS 10 else: 11 base_path = os.path.abspath(".") 12 return os.path.join(base_path, relative_path)
然后在需要調用文件的地方用如下格式包裹:
resource_path('resources/complete.wav')
然后在生成的.spec文件exe = EXE()中加入下面這行:
[('resources/complete.wav',r'C:\Users\Administrator\resources\complete.wav','music'),],
元組內的三個項:
第一個為代碼中resource_path包裹的地址;
第二個是文件的實際地址;
第三個是打包進程序的文件名字。
這樣打包后文件會被正確引用。
如下所示:
1 exe = EXE(pyz, 2 a.scripts, 3 a.binaries, 4 a.zipfiles, 5 a.datas, 6 [('resources/complete.wav',r'C:\Users\Administrator\projects\Diary\resources\complete.wav','music'),], 7 name='Diary', # 這里可以設置可執行文件的名字 8 icon='diary.ico',# 設置圖標 9 debug=False, 10 strip=None, 11 upx=True, 12 console=True ) # 是否開啟控制台模式
注意加地址前的r以及行尾的逗號,更新過spec文件后,再重新打包只需要執行pyinstaller start.spec 就可以了。
三、添加圖標
圖標的設置有兩種方式,一種是在執行打包命令時加入下面這句:
--icon=xxx.ico
第二種(推薦)是用文本編輯器或記事本打開執行打包后文件夾內新生成的xxx.spec文件,然后在exe =()中加入一行:
icon = ’xxx.ico‘
(見上面的代碼第八行)
xxx.ico 為你要設置的圖標文件,其他格式需要轉換成ico格式,可在這里在線轉換。
(圖標文件要放在程序根目錄下)
四、其他
- 64位windows上打包的程序不能在32位上運行,反之卻可以。
- 每次更改完代碼或是spec文件,只需要再重新執行一下pyinsyaller start.spec -F就可以了
五、替代品
如果pyinstaller沒有解決你的問題,那么你可以嘗試一下下面這兩個替代品: