一、前言
前面我们已经编写好生成排班的所有代码,在PyCharm中能正常运行,可是未安装Python环境的同事无法运行,本文就来介绍如何将Python文件打包成Windows可运行的exe文件。
二、打包成exe
项目结构很简单,只有两个Py文件加一张GUI图标:
Step1:
1.在Python项目虚拟环境和系统环境安装pyinstaller
pip install pyinstaller
2.在Python系统环境安装使用到的第三方库:PyYAML、ttkbootstrap
pip install pyyaml
pip install ttkbootstrap
3.若安装较慢,可以将镜像源修改为国内的地址:
Step2:
1.在Python项目目录路径栏输入cmd,回车
2.在cmd命令终端输入:pyi-makespec -w GUI_scheduling.py
GUI_scheduling.py是GUI主文件
参数-w:不打开console,-c:打开console
3.运行完成会在项目路径下生成GUI_scheduling.spec文件
Step3:
【关键】修改生成的spec文件
# -*- mode: python ; coding: utf-8 -*-
# 打包时可能出现大量的递归超出python预设的递归深度,报错:"RecursionError: maximum recursion depth exceeded",如下代码可解决
import sys
import os.path as osp
sys.setrecursionlimit(5000)
#----------------------------------------------------------------
block_cipher = None
# 项目路径
ROOT_DIR='D:\\Python Projects\\Working_Schedule\\'
# 1.以列表形式将项目中与打包文件相关的所有py文件写入Analysis
# 2.pathex:打包的主目录,默认生成,写入文件名即可
# 3.datas:资源文件或文件夹,以元组形式写入
# 4.hiddenimports:若打包后执行程序时出现"No Module named xxx",可以将xxx模块填入
a = Analysis(
['GUI_scheduling.py','Scheduling.py'],
pathex=['D:\\Python Projects\\Working_Schedule\\'],
binaries=[],
datas=[],
hiddenimports=['ttkbootstrap','yaml'],
hookspath=[],
hooksconfig={},
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)
# 参数icon="具体路径",修改exe的logo
exe = EXE(
pyz,
a.scripts,
[],
exclude_binaries=True,
name='Working_Schedule',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
console=False,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
icon=ROOT_DIR+'icon.ico'
)
coll = COLLECT(
exe,
a.binaries,
a.zipfiles,
a.datas,
strip=False,
upx=True,
upx_exclude=[],
name='Working_Schedule',
)
Step4:
1.在项目目录下运行CMD,输入命令:pyinstaller GUI_scheduling.spec
2.打包完成后命令行如下图所示:
3.打包完成会在项目路径下生成dist和build文件夹,exe文件存放在dist文件夹中,build文件夹可以删除,保留dist中的Working_Schedule文件夹即可
4.将Working_Schedule文件夹发给同事,exe运行效果如下图所示:
三、完整代码
Scheduling.py:
GUI_scheduling.py