pyinstaller打包exe(32位和64位)和執行太慢等問題解決

tqlisno1發表於2020-10-08

pyinstaller打包exe(32位和64位)和執行太慢等問題解決



前言

因為涉及到需求,因此筆者研究很久的python打包exe,目前有很多打包方法例如py2exe,pyinstaller,cx_Freeze,nuitka對python檔案進行打包成可執行檔案。但目前最常用而已也是最好用的是pyinstaller,因此筆者就來簡單介紹下pyinstaller的使用和遇到的一些坑


一、pyinstaller的安裝

  1. pyinstaller是python直接可以呼叫的一個包,直接在cmd裡pip install pyinstaller即可,目前pyinstaller支援的python版本為3.5-3.8,即3.5以上的任何python版本都能直接pip安裝使用pyinstaller。
  2. pyinstaller -v檢視是否安裝成功在這裡插入圖片描述

二、pyinstaller使用介紹

引數Value
-F,-onefile產生單個的可執行檔案
-D,–onedir產生一個目錄(包含多個檔案)作為可執行程式
-a,–ascii不包含 Unicode 字符集支援
-d,–debugdebug 版本的可執行檔案
-w,–windowed,–noconsolc指定程式執行時不顯示命令列視窗(僅對 Windows 有效)
-c,–nowindowed,–console指定使用命令列視窗執行程式(僅對 Windows 有效)
-o DIR,–out=DIR指定 spec 檔案的生成目錄。如果沒有指定,則預設使用當前目錄來生成 spec 檔案
-p DIR,–path=DIR設定 Python 匯入模組的路徑(和設定 PYTHONPATH 環境變數的作用相似)。也可使用路徑分隔符(Windows 使用分號,Linux 使用冒號)來分隔多個路徑
-n NAME,–name=NAME指定專案(產生的 spec)名字。如果省略該選項,那麼第一個指令碼的主檔名將作為 spec 的名字
Column 1Column 2
centered 文字居中right-aligned 文字居右

這裡常用的為-F 和-D,
專案結構:
在這裡插入圖片描述

  1. cmd到當前專案路徑
  2. pyinstaller -F xxx (xxx為專案主程式)在這裡插入圖片描述
  3. 等待執行結束專案中多了幾個檔案在這裡插入圖片描述dist、build和main.spec,我們需要的exe檔案在dist裡在這裡插入圖片描述
  4. pyinstaller -D xxx (這個是打包出多個檔案,而不是隻有一個可執行檔案,執行的時候每個檔案都不能少,特點:檔案小,執行速度快。缺點:檔案多)
  5. 打包結果在這裡插入圖片描述

三、打包32位和64位exe

在許多場景可能會用到32位的exe,因此需要打包32位的exe,當然取決於python的版本環境了,python如果是32位的那麼打包出來的exe也是32位的,64位同理。為了方便我們使用anaconda(anaconda安裝和使用教程)建立虛擬環境來打包32位exe。

  1. 先搭好好32位python環境和安裝各種需要的包

  2. 檢視是否位32位python環境在這裡插入圖片描述

  3. 輸入pyinstaller打包即可在這裡插入圖片描述

  4. 把打包好的exe檔案用記事本開啟,如果沒有這種開啟方式那就直接開啟一個記事本,然後把exe檔案拖到記事本,用文字編輯器開啟(以UTF-8編碼),搜尋關鍵詞PE(PEL對應32位,PEd對應64位)在這裡插入圖片描述
    一個32位的exe就打包好了

四、打包的exe檔案太大的問題

一個就只有幾十行程式碼的程式,打包出來竟然有300多MB,這完全超出了我們的,查了很多資料才知道,pyinstaller會把python環境中的很多專案沒有用到的包都一起打包進去,這樣就增大了exe的大小了,
解決方法:
使用anaconda建立一個單獨乾淨的虛擬環境,然後在這個單獨環境裡安裝相應的需要用到的包,然後對專案進行打包,這就是我們前幾篇文章提到的為啥要用anaconda的原因,方便我們管理每個專案的Python環境和對呀的包,幾乎都要坐到每個專案單獨對呀一個虛擬環境。這樣打包出來就只有10MB左右在這裡插入圖片描述

五、打包的exe檔案啟動執行太慢

在大多數的情況下,我們的專案是很大的,不僅僅是隻有幾十行程式碼而已。當我們pyinstaller -F xxx打包成單一的exe檔案後會遇到一個問題,就是明明在程式裡執行瞬間就啟動了,然而執行exe檔案的時候卻發現執行的很慢,幾乎要1、2分鐘左右才會開始啟動執行程式碼。那是因為:
-D:生成一個資料夾,裡面是多檔案模式,啟動快。
-F:僅僅生成一個檔案,不暴露其他資訊,啟動較慢。
我們都是隻想要一個檔案,而不想看到太多的附帶檔案,如何即想要單一檔案執行,又加快執行速度呢
解決方法:

  1. 使用pyinstaller -D xxx 打包,生成一個資料夾在這裡插入圖片描述
  2. 使用Enigma Virtual Box.exe這個資料夾裡的檔案進行重新打包
    百度網盤:https://pan.baidu.com/s/1uX6pH-MS9a4KLEbLvxcsZA
    提取碼:ppsg
  3. 把資料夾下的所有檔案(除開xxx.exe檔案#即主程式的exe檔案,我這裡是companyid.exe)拖進這個軟體裡在這裡插入圖片描述直接點確定即可,這個不影響
  4. 選擇主程式檔名稱在這裡插入圖片描述
  5. 點選打包即可在資料夾下看到最後打包好的companyid_boxed.exe在這裡插入圖片描述
  6. 最後把這個檔案取出來即可,其他的檔案都可以刪除掉,這樣就解決了單一可執行檔案exe執行太慢的問題。

總結

筆者每天都在不斷填坑,希望讀者可以用到,可以給讀者帶來作用是筆者每天不斷填坑的動力,最後祝讀者早日脫坑!

相關文章