最近項目上一直都是用Spyder直接運行.py文件的方式來執行每日的自動化程序,天天都要手動去點擊Run來執行一次,因此考慮把.py文件直接打包成exe,而後用windows的task schedule功能來讓它自動天天運行。
用pyinstaller來打包exe文件,同時爲了便於維護,給exe文件添加文件版本file version信息。
1. 安裝pyinstaller
機器上的python環境是直接安裝的Anaconda軟件,因此直接打開「Anaconda Prompt」來安裝pyinstaller,運行命令:pip install pyinstaller。(若是提示有其餘相關的組件xxxx缺失,用相應的方式來安裝就好: pip install xxxx)
2. 設置文件版本信息
爲了方便版本管控,最好是給每次打包發佈的exe文件設置文件版本信息——右鍵點擊exe查看屬性中的詳情信息中能夠看到版本信息。
其中的grab_version是用來捕獲一個exe文件的版本信息並自動在同一目錄下輸出一個file_version_info.txt文件版本信息的,其中set_version是用來給一個exe文件賦值版本信息的,用法分別以下:
1. 進入cmd界面
2. 將目錄轉移到C:\ProgramData\Anaconda3\Lib\site-packages\PyInstaller\utils\cliutils\下
3. 拷貝一個要獲取版本信息的exe文件到這個目錄下
4. 在cmd窗口鍵入:python grab_version.py filename.exe
5. 目錄下會自動出現一個標準的file_version_info.txt文件,雙擊打開,按照相應的需求修改
6. 在cmd窗口鍵入:python set_version.py file_version_info.txt youfilename.exe便可
在打包的時候就已經準備好了版本信息文件:file_version_info.txt
打包時用此參數--version-file 便可:pyinstaller --version-file file_version_info.txt test.py
最後打包成exe,能夠右鍵點擊exe文件查看詳細信息,能夠看到有文件版本信息。
3. 運行pyinstaller來打包exe
通常用pyinstaller打包exe會用到-F參數(表示打包成一個EXE文件)或者--version-file(給exe文件賦予版本信息),其餘參數如需瞭解,能夠輸入pyinstaller -h來獲取幫助信息。
好比須要打包test.py文件爲exe,用以下方式:
4. 打包exe過程當中遇到的問題:
通常來講,若是是機器上組件缺失致使打包失敗,安裝相應的組件便可。
問題1: 打包提示報錯:Cannot find existing PyQt5 plugin directories
解決方法:建立PyQt5 plugin的路徑,按報錯的路徑來新建,而後將原本pyqt文件加中的pyqt5qmlplugin.dll文件拷貝放入此路徑便可。
-
先查詢機器是上否有安裝pyqt以及文件夾,能夠用Anaconda Prompt中輸入conda list來查看機器上的pyqt的版本以及路徑信息(同理,也能夠用Everything來查詢此dll文件來定位到文件夾路徑)。
2. 新建報錯中提到的路徑,同時把dll文件拷貝進去。
問題2:打包提示報錯:RecursionError: maximum recursion depth exceeded
解決方法:由於python在處理循環的時候是手限制的,因此解除此限制便可
在打包文件夾中找到新生成的spec文件(好比test.spec),而後在該文件最上面添加以下2行來重定義循環次數便可;再運行此spec文件來打包便可:
import sys sys.setrecursionlimit(5000)