1. 程式人生 > 其它 >Python PyInstaller安裝和使用教程(詳解版)

Python PyInstaller安裝和使用教程(詳解版)

來自:http://c.biancheng.net/view/2690.html

在建立了獨立應用(自包含該應用的依賴包)之後,還可以使用 PyInstaller 將Python程式生成可直接執行的程式,這個程式就可以被分發到對應的 Windows 或 Mac OS X 平臺上執行。

安裝 PyInstalle

Python 預設並不包含 PyInstaller 模組,因此需要自行安裝 PyInstaller 模組。

安裝 PyInstaller 模組與安裝其他 Python 模組一樣,使用 pip 命令安裝即可。在命令列輸入如下命令:

pip install pyinstaller

強烈建議使用 pip 線上安裝的方式來安裝 PyInstaller 模組,不要使用離線包的方式來安裝,因為 PyInstaller 模組還依賴其他模組,pip 在安裝 PyInstaller 模組時會先安裝它的依賴模組。

執行上面命令,應該看到如下輸出結果:

Successfully installed pyinstaller-x.x.x

其中的 x.x.x 代表 PyInstaller 的版本。

在 PyInstaller 模組安裝成功之後,在 Python 的安裝目錄下的Scripts(D:\Python\Python36\Scripts)目錄下會增加一個 pyinstaller.exe 程式,接下來就可以使用該工具將 Python 程式生成 EXE 程式了。

PyInstaller生成可執行程式

PyInstaller 工具的命令語法如下:

pyinstaller 選項 Python 原始檔

不管這個 Python 應用是單檔案的應用,還是多檔案的應用,只要在使用 pyinstaller 命令時編譯作為程式入口的 Python 程式即可。

PyInstaller工具是跨平臺的,它既可以在 Windows平臺上使用,也可以在 Mac OS X 平臺上執行。在不同的平臺上使用 PyInstaller 工具的方法是一樣的,它們支援的選項也是一樣的。

下面先建立一個 app 目錄,在該目錄下建立一個 app.py 檔案,檔案中包含如下程式碼:

  1. from say_hello import *
  2. def main():
  3. print('程式開始執行')
  4. print(say_hello('孫悟空'))
  5. # 增加呼叫main()函式
  6. if __name__ == '__main__':
  7. main()

接下來使用命令列工具進入到此 app 目錄下,執行如下命令:

pyinstaller -F app.py

執行上面命令,將看到詳細的生成過程。當生成完成後,將會在此 app 目錄下看到多了一個 dist 目錄,並在該目錄下看到有一個 app.exe 檔案,這就是使用 PyInstaller 工具生成的 EXE 程式。

在命令列視窗中進入 dist 目錄下,在該目錄執行 app.exe ,將會看到該程式生成如下輸出結果:

程式開始執行
孫悟空,您好!

由於該程式沒有圖形使用者介面,因此如果讀者試圖通過雙擊來執行該程式,則只能看到程式視窗一閃就消失了,這樣將無法看到該程式的輸出結果。

在上面命令中使用了-F 選項,該選項指定生成單獨的 EXE 檔案,因此,在 dist 目錄下生成了一個單獨的大約為 6MB 的 app.exe 檔案(在 Mac OS X 平臺上生成的檔案就叫 app,沒有後綴);與 -F 選項對應的是 -D 選項(預設選項),該選項指定生成一個目錄(包含多個檔案)來作為程式。

下面先將 PyInstaller 工具在 app 目錄下生成的 build、dist 目錄刪除,並將 app.spec 檔案也刪除,然後使用如下命令來生成 EXE 檔案。

pyinstaller -D app.py

執行上面命令,將看到詳細的生成過程。當生成完成後,將會在 app 目錄下看到多了一個 dist 目錄,並在該目錄下看到有一個 app 子目錄,在該子目錄下包含了大量 .dll 檔案和 .pyz 檔案,它們都是 app.exe 程式的支撐檔案。在命令列視窗中執行該 app.exe 程式,同樣可以看到與前一個 app.exe 程式相同的輸出結果。

PyInstaller 不僅支援 -F、-D 選項,而且也支援如表 1 所示的常用選項。

表 1 PyInstaller 支援的常用選項
-h,--help檢視該模組的幫助資訊
-F,-onefile 產生單個的可執行檔案
-D,--onedir 產生一個目錄(包含多個檔案)作為可執行程式
-a,--ascii 不包含 Unicode 字符集支援
-d,--debug 產生 debug 版本的可執行檔案
-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 的名字

在表 1 中列出的只是 PyInstaller 模組所支援的常用選項,如果需要了解 PyInstaller 選項的詳細資訊,則可通過 pyinstaller -h 來檢視。


下面再建立一個帶圖形使用者介面,可以訪問MySQL資料庫的應用程式。

在 app 當前所在目錄再建立一個 dbapp 目錄,並在該目錄下建立 Python 程式,其中 exec_select.py 程式負責查詢資料,main.py 程式負責建立圖形使用者介面來顯示查詢結果。

exec_select.py 檔案包含的程式碼如下:

  1. # 匯入訪問MySQL的模組
  2. import mysql.connector
  3. def query_db():
  4. # ①、連線資料庫
  5. conn = conn = mysql.connector.connect(user='root', password='32147',
  6. host='localhost', port='3306',
  7. database='python', use_unicode=True)
  8. # ②、獲取遊標
  9. c = conn.cursor()
  10. # ③、呼叫執行select語句查詢資料
  11. c.execute('select * from user_tb where user_id > %s', (2,))
  12. # 通過遊標的description屬性獲取列資訊
  13. description = c.description
  14. # 使用fetchall獲取遊標中的所有結果集
  15. rows = c.fetchall()
  16. # ④、關閉遊標
  17. c.close()
  18. # ⑤、關閉連線
  19. conn.close()
  20. return description, rows

mian.py 檔案包含的程式碼如下:

  1. from exec_select import *
  2. from tkinter import *
  3. def main():
  4. description, rows = query_db()
  5. # 建立視窗
  6. win = Tk()
  7. win.title('資料庫查詢')
  8. # 通過description獲取列資訊
  9. for i, col in enumerate(description):
  10. lb = Button(win, text=col[0], padx=50, pady=6)
  11. lb.grid(row=0, column=i)
  12. # 直接使用for迴圈查詢得到的結果集
  13. for i, row in enumerate(rows):
  14. for j in range(len(row)):
  15. en = Label(win, text=row[j])
  16. en.grid(row=i+1, column=j)
  17. win.mainloop()
  18. if __name__ == '__main__':
  19. main()

通過命令列工具進入 dbapp 目錄下,在該目錄下執行如下命令:

Pyinstaller -F -w main.py

上面命令中的 -F 選項指定生成單個的可執行程式,-w 選項指定生成圖形使用者介面程式(不需要命令列介面)。執行上面命令,該工具同樣在 dbapp 目錄下生成了一個 dist 子目錄,並在該子目錄下生成了一個 main.exe 檔案。

直接雙擊執行 main.exe 程式(該程式有圖形使用者介面,因此可以雙擊執行),讀者可自行檢視執行結果。