python打包exe記錄

2021-10-05 06:03:19 字數 2223 閱讀 5363

因個人需要嘗試把pyqt開發的小軟體打包成exe給別人使用,網上搜了下打包很簡單,就一行**,但是暗坑比較多,特此記錄。

首先pip install pyinstaller,一定要安裝在軟體依賴的環境中

pyinstaller [引數] [要打包的程式.py]

引數說明:

-icon=圖示路徑

-f 打包成乙個exe檔案

-w 使用視窗,無控制台

-c 使用控制台,無視窗

-d 建立乙個目錄,裡面包含exe以及其他一些依賴性檔案

pyinstaller -h 來檢視引數

比如我的pyqt軟體,pyinstaller -fw d:\***.py,會在當前目錄(不一定是py檔案所在目錄)下建立乙個dist資料夾,裡面包含生成的exe檔案

軟體初步開發完後嘗試打包,一次成功,29m。但是無法開啟,在命令列執行後顯示

importerror:no module named 'sip'
網上查閱說需要在**裡加一行

import sip
提示找不到sip,於是通過pip安裝。

解決之後又報了另乙個錯

需要去python環境裡把platforms資料夾複製過來

注:出現以上問題可能是pyqt版本比較老的原因,重新安裝之後沒有出現錯誤

後續開發中又調了乙個第三方庫,打包時提示找不到nltk

之後仍然不能解決問題,還需要到pyinstaller安裝位置中修改hook-nltk.py,例如我的在d:\anaconda3\envs\py36\lib\site-packages\pyinstaller\hooks。將其中的

for p in nltk.data.path:
修改為nltk_data實際路徑

nltk_data的實際路徑也可以通過以下兩行**找到

from nltk import data

print(data.find('.'))

之後成功打包,一看大小傻眼了,600m!!!

開啟速度巨慢,而且出現了warning

warning不影響執行,沒有管。網上有類似文章,沒有嘗試。比如 

檢查打包過程輸出的資訊發現,pandas也被打包到了exe中,而我壓根就沒有用到。這說明,pyinstaller在打包時會把一些環境中存在但是程式沒有呼叫的包一起打包進去。網上查資料也證實了我的猜想。

普遍推薦的做法是:為需要打包的程式單獨建立乙個不包含任何多餘包的虛擬環境。用pipenv也好,virtualenv也好,anaconda也好,首先建立乙個純淨的python環境,然後只安裝需要的包以及pyinstaller

我用的anaconda,打包之後的程式僅有37m!!!雖然對於乙個小軟體來說仍然有點大,但是與原來的600m相比,已經足夠使人感動了。而且沒有任何error和warning(可能與新版本pyqt有關)

還遇到乙個檔案路徑問題。呼叫的第三方庫需要讀取本地檔案,**中使用的是os.path.dirname(__file__)指定的相對路徑,pyinstaller打包時會修改為以_mei開頭的快取資料夾路徑,因此會報找不到檔案的錯誤,類似於

解決方法是用os.path.dirname(sys.executable)替換

sys.executable是當前執行目錄,就是打包好的exe所在目錄,因此把所需檔案拷貝過來就可以正常讀取

(在用python開發過程中,sys.executable是python直譯器所在路徑)

python打包exe程式

1.安裝py2exe 2.編寫setup.py 如下 coding utf 8 from distutils.core import setup import py2exe powered by includes options setup options options,description m...

python檔案打包成exe

將自己寫的python檔案壓縮成exe有兩種方法 1 使用pyinstaller step1 安裝pyinstaller,在cmd視窗使用pip install pyinstaller安裝 step2 cd 到你的檔案目錄cd d py python testcases slice step3 執行...

python 打包成exe程式

1.需要安裝 py2exe 2.示例 exetest.py 建立乙個gui介面,只用乙個標籤和按鈕,無功能 from tkinter import win tk label label win,text hello btn button win,text click label.pack btn.p...