Pyhton打包總結(pyinstaller)


 

在學《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格式,可在這里在線轉換。

(圖標文件要放在程序根目錄下)

 

四、其他

 

  1. 64windows上打包的程序不能在32位上運行,反之卻可以。
  2. 每次更改完代碼或是spec文件,只需要再重新執行一下pyinsyaller start.spec -F就可以了

 

五、替代品

 

如果pyinstaller沒有解決你的問題,那么你可以嘗試一下下面這兩個替代品:

py2exe

cx_Freeze

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM