使用py2exe编译Python程序时遇缺失模块及运行报错求助
解决py2exe打包后
ModuleNotFoundError: No module named 'encodings'问题 问题分析
你遇到的encodings模块缺失错误,核心原因是bundle_files=0的配置导致Python核心运行时模块未被正确嵌入或打包;编译日志中的13个缺失模块,部分是py2exe的误报,但encodings、os.path这类核心模块需要手动指定包含。另外,distutils已被Python官方弃用,改用setuptools可避免兼容性问题。
解决方案
方案1:单文件打包配置(推荐)
将distutils替换为setuptools,调整打包参数把所有依赖嵌入单个exe,同时显式包含encodings模块:
from setuptools import setup import py2exe setup( console=['Parser_002.py'], options={ "py2exe": { "unbuffered": True, "optimize": 2, "bundle_files": 1, # 打包为单个可执行文件 "zipfile": None, # 将library.zip内容嵌入exe,消除外部依赖 "compressed": False, "includes": ["encodings", "encodings.*"], # 强制包含编码核心模块 "excludes": [], "packages": [], "dll_excludes": [] } } )
方案2:多文件打包配置
若需保留多文件结构(bundle_files=0),需显式包含核心模块并排除无用的平台相关模块:
from setuptools import setup import py2exe setup( console=['Parser_002.py'], options={ "py2exe": { "unbuffered": True, "optimize": 2, "bundle_files": 0, "compressed": False, "includes": ["encodings", "encodings.*", "os.path"], # 补充核心缺失模块 "excludes": ["_posixshmem", "java.lang", "resource"], # 排除无意义的平台模块 "packages": [], "dll_excludes": [] } } )
方案3:适配Python版本
py2exe对Python 3.12+支持有限(因distutils被移除),若你使用Python 3.12及以上版本,建议降级到Python 3.11,或切换到PyInstaller等更现代的打包工具。
验证步骤
- 删除原有
build和dist目录,清除打包缓存 - 重新执行打包命令:
python setup.py py2exe - 进入
dist目录运行生成的Parser_002.exe
关于编译日志的缺失模块说明
日志中的13个缺失模块,多数是平台专属、调试或测试类模块(如_posixshmem、java.lang),不会影响程序运行,可安全排除;但encodings、os.path属于Python核心运行依赖,必须手动指定包含。
内容的提问来源于stack exchange,提问作者PythonNoob
相关产品推荐
相关产品推荐

