安裝pyinstaller
打開cmd窗口,輸入pip install pyinstaller,命令行輸出successfully表示成功。
生成exe文件
一、單個py文件
在py文件目錄下,打開cmd窗口,輸入pyinstall -F XXX.py,執行成功的話,會在當前目錄生成一個dist文件夾,XXX.exe文件在此文件夾下。
如果是圖形窗口,不想要控制台出現的話,可以pyinstall -F XXX.py --noconsole
安裝好pyinstaller后,我們會得到兩個輔助工具,pyi-grab_version和pyi-set_version。
1. 使用pyi-grab_version創建版本信息模板文件,首先找到一個有版本信息的XXX.exe工具,在此目錄下打開cmd窗口,輸入pyi-grab_version XXX.exe,執行成功后,會在此目錄下獲得一個file_version_info.txt文件,這個就是我們要的文件版本信息模板文件。
2. 有了模板文件后,我們需要修改里面的內容,換成我們自己想要的版本內容,最好用nopad++打開。
3. 在打包時加入版本信息。
方法一、還沒有打包成exe的py文件
pyinstaller -F --version--file file_version_info.txt XXX.py
方法二、已經打包好的exe
pyi-set_version file_version_info.txt XXX.exe
二、多個py文件
1、盡量將所有要執行的py文件放在一個大文件夾下(里面允許有多個文件夾)
2、命令行輸入pyi-makespec main.py 或者 pyi-makespec -F main.py(main.py為Python程序的入口py文件)。
pyi-makespec main.py --> 打包之后會生成一個目錄
pyi-makespec -F main.py --> 打包之后只會生成一個exe
選擇一個命令即可。
3、現在文件夾下生成了一個main.spec文件和兩個文件夾
4、編輯main.spec文件,找到a = Analysis(),先修改第一個參數,這里面的列表都必須是py文件
a = Analysis(['pin.py'], pathex=['F:\\python_work\\pytest\\pin'], binaries=[], datas=[], hiddenimports=[], hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
如果用到了其他的py文件,就在第一個列表里面加入相應py文件的路徑,如果是同級目錄下,直接寫文件名,如果不在同一個文件下,寫完整路徑。
a = Analysis(['pin.py', 'cursor_control.py'], pathex=['F:\\python_work\\pytest\\pin'], binaries=[], datas=[], hiddenimports=[], hookspath=[], runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
如果用到了非py文件需要打包,那么找到datas列表,將非py文件的路徑與文件夾名寫在元組里。
例如:
datas = [('C:\\project\\test\\images','images'),('C:\\project\\test\\EventLogs','EventLogs')]
datas:
- 第一個參數是Python中的非py類型文件的路徑
- 第二個參數是非py文件保存此資源的文件夾名稱,要和路徑中的文件夾名稱相同。
5、保存文件,在.spec文件路徑下打開命令行,輸入pyinstaller -D main.spec 或者 pyinstaller main.spec
如果在第2條中選擇了pyi-makespec -F main.py ,那么此處只需要執行pyinstaller main.spec即可
6、生成的exe程序在dist文件夾中,dist文件夾里包含了整個項目所需環境,可在其他電腦中進行使用。
特別注意: 如果寫了關於pyqt5界面的程序的話,在其主函數里面導入PYQT5之前需要加上如下代碼
import os if hasattr(sys, 'frozen'): os.environ['PATH'] = sys._MEIPASS + ";" + os.environ['PATH'] from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog from PyQt5 import QtCore, QtGui, QtWidgets
參考鏈接:http://www.yunweishare.com/?p=726
ok.