Python程序打包EXE遇到的各種坑


廢話不多說,反正我現在還沒成功,不過我記錄一下遇到的坑!

1:安裝相關庫太慢

解決辦法:離線安裝

在一大堆教程中,要安裝好幾個庫,但是有些庫用pip在線安裝一直卡死(看不到進度條,就當卡死吧),這個問題可以使用離線安裝來解決,下面附上解決過程!

安裝錯誤提示(其實是太慢了,我強制停止了)

$ pip install pywin32
Collecting pywin32
  Downloading https://files.pythonhosted.org/packages/a3/8a/eada1e7990202cd27e58eca2a278c344fef190759bbdc8f8f0eb6abeca9c/pywin32-224-cp37-cp37m-win_amd64.whl (9.0MB)
ERROR: Operation cancelled by user

  

解決方法如下:

首先找到這個庫的下載鏈接,在這里的就是:

https://files.pythonhosted.org/packages/a3/8a/eada1e7990202cd27e58eca2a278c344fef190759bbdc8f8f0eb6abeca9c/pywin32-224-cp37-cp37m-win_amd64.whl

 

然后使用其他HTTP下載工具,我用的是IDM,也可以使用瀏覽器!

然后打開存放目錄,

然后在這里打開命令行,執行

pip install pywin32-224-cp37-cp37m-win_amd64.whl

  

因為我的已經安裝了,當時沒截圖,我也懶得卸載了,反正就是后面接上庫文件就行了(輸入文件名第一個字母之后,按TAB鍵可以補全)

然后到這里第一個坑就解決了,這個方法適合所有庫的安裝(官方太慢的時候或者需要安裝第三方庫)!!

第二個坑,調試沒問題,運行就報錯(代碼錯誤)

在這里我確定使用py文件運行是沒問題的,但是打包之后卻提示我沒有定義exit變量/函數(exit是系統變量)

對於這個問題我暫時的解決辦法有兩個,要么舍棄這個退出功能,否則無法打包,要么定義這個函數!

我的退出原代碼為,這樣子是打包不了的,至少我打包的時候是這樣

bt_exit = tk.Button(win, text="更新軟件", font=("宋體", 15), command=exit).place(x=500, y=250) 

  

可以參考這個方法---- python 退出程序方法

怎么去定義我就不細說了,能寫出程序的人看了這個方法都會懂的

那么第二個坑就解決了(雖然我發現定義了之后點擊退出卻沒有反應,這個可以點X關閉,所以我就先不管了)

第三個坑:運行提示Failed to execute script main

首先,執行構建命令:

pyinstaller -F 主程序.py

  

然后查看文件列表

將配置文件(背景文件)放在一起!

最后運行程序!----------------------居然不報錯了!

​其實呢,在我之前的構建中是報錯的,錯誤提示是

Failed to execute script 

  

在這里我也順便說一下理論能解決這個錯誤的方法

首先確保所需文件都在你寫的相對目錄里,例如我這個程序調用的背景寫的是

impath = 'timg.jpg'
img = Image.open(impath)

  

所以這個timg.jpg是跟主程序在同一級目錄的,這時候你就需要把這些調用的文件放在所在的目錄,然后在構建文件編輯一下,方法如下:

找到這個.spec文件,使用文本編輯(在這里我用vim工具),下面第二張圖(VIM);

windows用戶建議使用Notepad++,下面第三張圖(Notepad++)

反正就是在.spec里面修改一下參數,首先找到

a = Analysis

  

然后找到參數datas,在后面加上你需要調用的文件名(不在同級目錄的要寫路徑加文件名),例如我這里要調用的是timg.jpg文件,而這個文件和程序在同一目錄,那么參數就是
datas=['timg.jpg'],

  

假如我的代碼寫的是程序目錄下的bg目錄下的timg.jpg文件,那么參數就要寫成
datas=['bg\timg.jpg'],

  

為避免出現各種錯誤,如果是小的程序,建議全部調用文件放在程序根目錄!那么到這里也就成功一半了(總不能把程序發給別人的時候還要帶上配置文件吧)!

接下來繼續壓縮!

在打包程序的時候是不會打包圖片文件的,但是我們可以把圖片文件轉為py文件,所以解決這個背景問題的關鍵點就是這個了,下面附上一些別人的教程!

Pyinstaller 使用+打包圖片方法

下面是我的打包記錄。

首先安裝相關庫

pip install img
pip install base64

  

然后新建一個py文件,內容如下
#image轉base64
import base64
with open("timg.jpg", "rb") as f:#轉為二進制格式
base64_data = base64.b64encode(f.read())#使用base64進行加密
print(base64_data)
file = open('1.txt', 'wb')#寫成文本格式
file.write(base64_data)
file.close()

  

上面的代碼需要注意的就是變量,變量解釋如下
"timg.jpg" #需要轉換的圖片文件
"bg.py" #要生成的圖片PY文件

  

運行之后得到下面的數據----很長很長的,如果你得到的是很短的,那就考慮一下是不是圖片原文件出問題了,還有一個更快的方法,在線轉換

http://imgbase64.duoshitong.com/

然后得到這個開頭的編碼
data:image/jpeg;

  

轉換之后就需要調用,調用方法如下

首先需要導入base64庫以及OS庫

所以需要添加的代碼有兩部分,第一部分是庫導入

import base64
import os

  

第二部分則是創建臨時文件的代碼
strs = '''...............//Z\n\n\n\n\n \n\n\n'''
imgdata = base64.b64decode(strs)
file = open('timg.jpg', 'wb')
file.write(imgdata)
file.close()

  

上面的strs中,填寫的方法為在下面這段代碼中插入從網頁獲取到的圖片轉base4的加密信息
import os,base64 
strs='''圖片編碼放這里,其他不要動\n\n\n\n\n \n\n\n'''
imgdata=base64.b64decode(strs)
file=open('1.jpg','wb')
file.write(imgdata)
file.close()

  

上面的代碼中,1.jpg表示新生成的圖片文字,這個要根據你的實際需求進行更改

那么,到這里就變相解決了無法打包圖片文件的問題了,接下來重新封裝程序看看

 


免責聲明!

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



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