Pyinstaller (python打包為exe文件)


需求分析:

  • python腳本如果在沒有安裝python的機器上不能運行,所以將腳本打包成exe文件,降低腳本對環境的依賴性,同時運行更加迅速。
  • 當然打包的腳本似乎不是在所有的win平台下都能使用,win7有一部分不能使用,我在win10能夠很好的運行。

准備:

安裝:

需要安裝pyinstaller和pywin32
使用以下命令將會自動安裝兩個包,在cmd用pip命令

  • 方法一:
pip install -i https://pypi.douban.com/simple/pyinstaller(豆瓣源)
  • 方法二:
pip install pyinstaller(會自動下載future, pywin32, pyinstaller)

運行方式:

1、cmd進入到安裝pyinstaller的python環境下的/python/scripts目錄 找到pyinstaller.exe。
2、執行命令:

pyinstaller.exe -F path:demo.py

案例:

將D:\pythonProject\python3.5\september19\calculator.py文件打為exe可執行文件

# 1.cmd進入到安裝了pyinstaller的目錄下
D:\pyutil>F:  # 切換盤符
F:\>cd pyenv/pyutil/scripts  # 切換目錄
# 執行命令 -F 生成one-file的程序
F:\pyenv\pyutil\Scripts>pyinstaller.exe -F D:\pythonProjects\Python3.5\september19\calculator.py
# 執行成功后會當當前目錄下生成一個dist目錄並在dist目錄上生成一個exe文件
11445 INFO: Appending archive to EXE F:\pyenv\pyutil\Scripts\dist\calculator.exe

各參數含義

通用參數
參數名 描述 說明
-h 顯示幫助
-v 顯示版本號
--distpath 生成文件放在哪里 默認:當前目錄的dist文件夾內
與生成結果有關參數
參數名 描述 說明
-D 生成one-folder的程序(默認) 生成結果是一個目錄,各種第三方依賴、資源和exe同時存儲在該目錄下
-F 生成one-file的程序 生成結果是一個exe文件,所有的第三方依賴、資源和代碼均被打包進該exe內
-n 生成.exe文件和.spec的文件名 默認:用戶腳本的名稱,即main.py和main.spec
Windows和Mac特有的參數
參數名 描述 說明
-c 顯示命令行窗口 與-w相反,默認含有此參數
-w 不顯示命令行窗口 編寫GUI程序時使用此參數有用。
-i 為main.exe指定圖標 pyinstaller -i beauty.ico main.py

詳情請參考:PyInstaller各參數含義

后記

  • 程序自定義圖標:
pyinstaller -F -i ico_path py_path

首先需要下載一張正常的ico,不能直接修改后綴的。
下載圖片:https://www.easyicon.net
圖片改ico:http://www.bitbug.net
輸入命令

pyinstaller -F -i demo.ico main.py  # 命令格式一定是先圖標路徑,再程序路徑。
  • 報錯提示:
    路徑最好為英文,沒有中文字符;腳本名稱里沒有特殊字符如.
    使用utf-8編碼
    圖標文件必須是正常格式,不能直接更改后綴。
    tuble index out of range --> pyinstaller 版本未支持的python版本
  • 窗口程序
    使用 pyinstaller -F -w -i ico_path py_path ,這樣腳本不會彈出命令窗,前提是用了GUI庫.

幾個非常重要的問題

  • 命令使用pyinstaller和pyinstaller.exe結果都是一樣的
  • -w是不顯示命令窗口, -i 圖標文件的路徑 這是改變圖標的,但是我發現只能改變任務欄里的和命令窗口的圖標,並不能改變exe文件的圖標。另外這些參數要加載pyinstaller和路徑中間。
  • 有一些代碼需要調用一些圖片和資源文件的,這是不會自動導入的,需要你自己手動復制進去才行。不然exe文件運行時命令窗口會報錯找不到這個文件。
  • 也是最坑的一點。就是當你使用錯誤的參數去打包或者打包到一半中斷,等等此類運行到一半沒了的情況。會導致你原來的py文件變成一個0KB的空文件。里面的代碼會全部消失!!!所以以后需要有個良好的習慣,就是復制一份代碼出來,用這個副本進行打包。並且參數出錯,或者打錯了導致失敗時,檢查下副本文件的py文件是否還存在再繼續重新打包,不然打出來的就是空的文件,自然一直閃退,因為壓根沒內容。
  • 寫代碼的時候應當有個良好的習慣,用什么函數導什么函數,不要上來import整個庫,最后你會發現你一個100KB的代碼打包出來有500MB,全是庫,簡直無語
  • pygame代碼調試的時候要用quit()不然程序結束時會崩潰。但是直接運行py文件就不需要這個函數。這個我們之前的文章也提到過了。但是這里當我使用-w做成無窗口的程序后,一結束發現報錯,暫停后發現報的是找不到quit()函數。可見這個函數其實是一個很讓人無語的函數。一方面pygame官方網上說結束程序的時候需要加入這個函數。另一方面其實在正在運行時都不需要甚至會報錯。雖然也不影響運行,但是彈個窗口出來說 什么不fail to execute總是讓別人覺得你是個lowb。所以,調試的時候加一下,到時候execute的時候去掉。


免責聲明!

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



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