1、前言
Python雖好,但是平時我們寫的代碼都是.py腳本文件,必須要在Python環(huán)境下 才可以運行。如果一臺電腦沒有安裝Python是無法運行我們的程序的。當然你也可以選擇隨身攜帶安裝包。 不過終究是有些麻煩。那么有沒有什么辦法,能把我們編寫的Python代碼轉換成exe文件呢?這樣不管到哪, 只要能打開exe就可以運行我們的程序。當然,辦法是有的。網(wǎng)上一搜就有py2exe、pyinstaller等包可以實現(xiàn) 我們想要的這個功能。這里我們選擇pyinstaller。
2、Pyinstaller的使用
(1)安裝PyInstaller
PyInstaller官網(wǎng)地址在這,點擊進入。其官網(wǎng)首頁非常簡潔。截圖如下:

官網(wǎng)的“快速開始”建議我們直接通過pip安裝。然后在控制臺轉移到腳本所在的目錄,直接”pyinstaller yourprogram.py” 即可生成exe文件。十分方便。
首先打開控制臺,輸入”pip install pyinstaller”,然后就是靜待安裝。
(2)使用PyInstaller
為了測試它的功能到底好不好用,這里特意挑選了一段稍微復雜點的代碼,如下:
# coding=utf-8
import numpy as np
import cv2
def nothing(x):
pass
path = raw_input("Input the path of image:\n")
img = cv2.imread(path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
threshold = 128
result = gray
cv2.namedWindow("Threshold Test")
cv2.createTrackbar('Threshold', 'Threshold Test', threshold, 255, nothing)
cv2.createTrackbar('0:Off 1:On', 'Threshold Test', 1, 1, nothing)
while 1:
cv2.imshow('Threshold Test', result)
k = cv2.waitKey(1) & 0xff
if k == 27:
break
threshold = cv2.getTrackbarPos('Threshold', 'Threshold Test')
s = cv2.getTrackbarPos('0:Off 1:On', 'Threshold Test')
if s == 0:
result = gray
else:
ret, result = cv2.threshold(gray, threshold, 255, cv2.THRESH_BINARY)
cv2.destroyAllWindows()
這段代碼引用了比較大的OpenCV函數(shù)庫。而且有控制臺部分,也有圖形界面部分。算是比較全的覆蓋了 可能用到的情況。這段代碼的功能是首先用戶在控制臺輸入一張圖片的地址,然后彈出一個二值化界面。 在該界面上有一個滑動條,可以拖動改變二值化閾值,另一個可以打開或關閉二值化效果。演示圖如下:

下面就把這個腳本文件變成一個獨立運行的exe。首先打開控制臺,然后切換到該文件所在的目錄下。 注意首先要切換盤符,直接輸入”D:”或其它即可換到該盤下。然后再輸入”cd D:\output"換到該目錄下。 直接cd是換不到D盤的。

換到該目錄后,輸入”pyinstaller threshold.py”,按回車等待即可。生成時間取決于代碼多少和復雜程度。 完成后如下圖所示。

再次打開我們的目錄,可以發(fā)現(xiàn)多了幾個東西。

我們想要的exe可執(zhí)行文件就在dist文件夾中。所以我們只需要將整個這個文件夾隨著攜帶,就可以在沒有Python 的機器上運行我們的程序了。而至于其它的build文件夾和spec文件則是生成過程中產生的文件,我們可以不用管它。

可以看到PyInstaller把我們引用的OpenCV庫原封不動地包進來了,此外還有其它一些與界面有關的東西。 打開dist中的threshold.exe便可以成功運行程序,如下所示。

如圖可以看到,首先打開了一個黑框框要我們輸入圖片路徑,然后彈出了界面。和我們預想的一樣,完美達成目標。
(3)只打包一個exe軟件
上面其實我們已經(jīng)實現(xiàn)了我們的目標。但有時我們不想拷給別人一大堆東西。只有一個exe文件。這樣也很好辦,我們 只需要在生成的時候,在文件名前面加上”-F”這個參數(shù)即可。

輸入”pyinstaller -F threshold.py”。輸出結果就只有一個exe了。

對比之前的那個exe和這個exe,可以發(fā)現(xiàn)這個更大了(29.4 MB),而上面的那個exe只有3.36 MB。但是整個dist文件夾的 大小是75.9 MB。所以從最終結果上來說,這一種方法更省空間。
但經(jīng)過測試,它雖然省空間,也更方便(只有一個文件),但有點小問題,那就是程序啟動稍微慢一點。同樣的代碼使用第一種 方式生成的exe是可以做到秒開的。而第二種方式的exe,經(jīng)過記錄,從打開到控制臺彈出輸入路徑提示,平均在10秒左右。 個人認為可能的原因在于他把那么多文件壓縮到了一個文件中,所以每次啟動都要先解壓縮那些文件到緩存中,而文件很多, 且壓縮比應該也很高,必然導致很慢。如圖所示是第一種方法生成的文件,有將近1000個文件。

所以說,魚和熊掌不可兼得。如果說你不介意程序的啟動速度或者說打開一次可以用很久,為了追求方便,那可以使用第二種方法。 如果你的程序需要經(jīng)常打開,那還是建議你采用第一種方法吧。畢竟誰也不想每次開都浪費幾秒鐘的生命, 而且整個文件夾拷給別人也就是一個壓縮包的事。個人猜測如果代碼比較簡單,生成的文件較少。那么可能兩者差異應該不會很大。
此外PyInstaller還支持自定義圖標等等,以上只是介紹了基本功能,更多功能可以去看官方的Manual,點擊閱讀。
3、踩坑記錄
在后續(xù)使用過程中,發(fā)現(xiàn)了PyInstaller的一些弊端,在這里簡單總結一下,并給出解決辦法。
(1)不支持中文
首先是不支持中文,或者說不支持UTF-8編碼。PyInstaller只支持ASCII編碼。下面分別對各種含有中午的情況進行測試。
(2)生成路徑含有中文
如生成路徑為:D:\新建文件夾>pyinstaller 060302.py 。經(jīng)過測試,生成路徑含有中文名,是可以無法生成成功的。如下所示。

提示錯誤為ascii解碼器無法識別路徑索引為3的地方的’0xd0’字符。所以生成路徑不能有中文。
(3)運行路徑含有中文
根據(jù)上面的結論,生成路徑不含中文,生成成功。然后我們將dist文件夾拷貝到一個中文路徑下,如下圖所示。

將dist拷貝到“測試”文件夾下,經(jīng)過實驗,發(fā)現(xiàn)是可以正常運行的。因此運行路徑?jīng)]有限制,可以含有中文。 同時可執(zhí)行文件的名稱也可隨意修改,包含中文,因為文件名本身也是路徑的一部分。路徑可含中文,文件名 同樣可以包含中文名。
(4)代碼中含有中文
如果在注釋中含有中文,需要在python文件第一行增加# coding=utf-8,否則python下就會報錯。 如果在代碼本身,如控制臺提示語句中含有中文,同理添加utf-8。這樣可以保證在python下不會出錯。 但即使添加了這句話,在輸出的控制臺還是會有問題。因為PyInstaller輸出的控制臺程序不支持 中文。如下圖所示,“請輸入內容:”在這里變成亂碼了。

又如需要對一個中文字符串進行處理時,spilt某個中文字符,在python下正常,但是轉換后就會報錯。 如果在控制臺輸入語句中含有中文,轉成exe后可以支持輸入中文。如下。

總結一下也就是說,如果想轉成exe后還可以正常使用的話,那就不要在執(zhí)行代碼中包含中文字符,否則必然報錯。
(5)控制臺一閃而過
準確來說這不是PyInstaller的問題,而是Windows的問題。即使是用C/C++寫的控制臺程序,在Windows下運行結束后 都會自動退出。由于運行速度很快,給人的感覺就是一閃而過。在C++中解決這個問題是在代碼最后加上一句system('pause'), 或是加上一句輸入語句等待用戶輸入。所以在Python中的解決方法類似,也有兩種解決辦法。
增加輸入語句
在代碼的最后增加raw_input()即可,如果想更完善,可在括號的提示語句里寫上”Press any key to exit.”。
raw_input("Press any key to exit.")
轉為exe后在控制臺下運行的效果如下:

完美實現(xiàn)了我們想要的效果。
強制暫停
類似于C++下面的system('pause'),這里導入os包,然后添加語句。
importosos.system('pause')
運行效果如下所示:

控制臺不支持粘貼復制
在控制臺中,發(fā)現(xiàn)不管是Ctrl+V還是鼠標右鍵都無法粘貼。其實并不是不支持,而是需要設置一下。 首先點擊窗口左上角的圖標,然后找到“屬性”。

然后在打開的選項中找到“快速編輯模式”,選中并點擊確定。這樣就支持復制粘貼了。

注意在控制臺中復制粘貼是通過鼠標右鍵完成的。選中某段文字單擊右鍵即可復制,復制某段文字后, 回到控制臺單擊右鍵即可粘貼。
可能是某些庫沒有被打包進來文章來源:http://www.zghlxwxcb.cn/news/detail-492940.html
可以在CMD中看看軟件報的錯誤,然后從Python/lib/site-packages找到該包復制到打包后的文件夾中即可。文章來源地址http://www.zghlxwxcb.cn/news/detail-492940.html
到了這里,關于Python程序打包exe可執(zhí)行軟件教程的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!