使用cx_Freeze打包Python3.6.5脚本生成的EXE运行报错,原脚本正常
我来帮你捋捋这个问题——直接跑.py脚本没问题,但打包成EXE就报错,这在cx_Freeze里是很常见的情况,我整理了几个高频的解决方向:
首先先把你遇到的报错内容贴出来(看起来没显示完整,后面的关键错误信息很重要):
D:\TEST2000>Get-List-FoldersID-and-Titles.exe
Traceback (most recent call last):
File "C:\Python-365\lib\site-packages\cx_Freeze\initscripts__startup__.py", line 14, in run
module.run()
File "C:\Python-365\lib\site-packages\cx_Freeze\initscripts\Console.py", line 26, in run
exec(code, m.dict)
File "D:\TEST2000\Get-List-FoldersID-and-Titles....
1. 手动补全缺失的依赖模块/资源
cx_Freeze经常会漏掉一些隐式导入的模块,或者脚本里用到的配置文件、静态资源。你可以在setup.py里手动指定这些内容:
from cx_Freeze import setup, Executable import sys # 定义可执行程序 exe = Executable( script="Get-List-FoldersID-and-Titles.py", base="Console" # 如果是GUI程序就换成"Win32GUI" ) # 打包配置 setup( name="FolderIDListTool", version="1.0", description="Fetch folder IDs and titles", executables=[exe], options={ "build_exe": { # 把脚本用到的所有模块都列进去 "packages": ["os", "sys", "你的其他依赖模块"], # 如果有资源文件(比如json、txt),这里填路径 "include_files": ["path/to/your/resource.file"] } } )
2. 匹配cx_Freeze和Python3.6.5的兼容版本
Python3.6.5比较老,高版本的cx_Freeze可能不兼容。建议卸载现有版本,安装5.1.1或者5.3.1这个适配版本:
pip uninstall cx_Freeze -y pip install cx_Freeze==5.1.1
3. 修复脚本中的路径问题
直接跑.py时,路径是基于脚本所在目录,但打包成EXE后,程序的工作目录会变,甚至cx_Freeze会把资源放到临时文件夹_MEIPASS里。你可以在脚本里用动态路径获取:
import os import sys # 获取当前程序的实际根路径 if getattr(sys, 'frozen', False): # 打包成EXE后的运行环境 base_dir = sys._MEIPASS else: # 直接运行py脚本的环境 base_dir = os.path.dirname(os.path.abspath(__file__)) # 之后所有文件路径都用base_dir拼接,比如: config_path = os.path.join(base_dir, "config.ini")
4. 获取完整的报错信息
你现在贴的报错内容没显示最后一行,而最后一行通常会明确指出错误原因(比如ModuleNotFoundError: No module named 'xxx'或者FileNotFoundError),建议重新运行EXE,把完整的Traceback贴出来,这样能更精准定位问题。
内容的提问来源于stack exchange,提问作者Houcine HK

