根本原因是打包未包含运行时必需的动态链接库、隐藏模块和资源文件;glibc版本不兼容(如centos 7的2.17无法运行依赖glibc_2.28的程序),动态导入被静态分析遗漏,以及资源路径未适配临时解压目录。

根本原因不是“没装Python”,而是打包时没把运行时真正需要的东西带全——尤其是动态链接库、隐藏模块和资源文件。
glibc 或 libstdc++ 版本不兼容(Linux)
PyInstaller 生成的可执行文件不是纯静态二进制,它仍依赖目标系统的基础 C 运行时。比如你在 CentOS 7(glibc 2.17)上打包,拿到 Ubuntu 24.04(glibc 2.39)上跑可能没问题,但反过来大概率报 GLIBC_2.28 not found 错误。
- 用
ldd dist/your_app查看依赖项,重点关注libc.so.6、libstdc++.so.6的版本要求 - 最稳妥的做法:在最低版本的目标系统上打包(例如想支持 CentOS 7,就在 CentOS 7 虚拟机里打包)
- 避免在 WSL 或 Docker 容器里用高版本 glibc 打包后直接丢到旧服务器上
模块被 PyInstaller 漏掉(所有平台通用)
PyInstaller 靠静态分析 import 语句找依赖,遇到动态导入(importlib.import_module)、字符串拼接导入(__import__(f"pkg.{name}"))或某些框架的插件机制(如 skimage、customtkinter),就会漏掉模块。
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
- 典型错误:
ModuleNotFoundError: No module named 'customtkinter.theme',即使你 pip install 了也没用 - 先试
--hidden-import=customtkinter.theme,不行就加完整路径:--hidden-import=customtkinter.theme.dark - 更彻底的方法:用
pyinstaller --collect-all customtkinter your_script.py把整个包拉进来
图标、配置文件、数据文件路径失效(Windows/macOS/Linux 全中招)
用 --onefile 打包后,程序实际运行在临时解压目录(如 C:\Users\XXX\AppData\Local\Temp\_MEIxxx),但你的代码还按开发时的相对路径去读 icon.ico 或 config.json,自然找不到。
- 打包命令必须显式带上资源:
--add-data "icon.ico;."(Windows)或--add-data "icon.ico:."(macOS/Linux) - 代码里不能写
open("icon.ico"),得用这个函数适配:
import sys, os
def resource_path(relative_path):
if getattr(sys, 'frozen', False):
return os.path.join(sys._MEIPASS, relative_path)
return os.path.join(os.path.abspath("."), relative_path)
然后调用 resource_path("icon.ico")
最容易被忽略的是:同一段代码,在开发环境能跑 ≠ 打包后能跑;而打包后能在你电脑跑 ≠ 能在别人电脑跑。关键不在“有没有Python”,而在“运行时环境是否被完整重建”。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










