Python脚本转EXE后os.walk方法无法正常工作的问题咨询
PyInstaller打包Python脚本为EXE的常见问题与解决办法
问题根源
你的脚本里用了os.path.realpath(__file__)获取当前脚本路径,但PyInstaller打包成EXE后,程序运行时会把代码解压到系统临时目录(比如C:\Users\<用户名>\AppData\Local\Temp\_MEIxxxxxx),__file__指向的是这个临时目录里的文件,而非EXE所在的实际目录,所以os.walk遍历的是临时目录,自然找不到目标HTML文件。
修复后的代码
替换路径获取逻辑,同时优化HTML文件的判断方式(避免无后缀或多后缀文件报错):
import sys import os from os import walk from os.path import join def get_html_file_path(file_path): htmlfile = [] for root, dirs, files in walk(file_path): for f in files: # 用endswith更稳妥,还能兼容大写后缀的HTML文件 if f.lower().endswith(".html"): fullpath = join(root, f) htmlfile.append(fullpath) return htmlfile # 区分脚本运行和打包后的环境 if getattr(sys, 'frozen', False): # 打包成EXE后,获取EXE所在目录 file_path = os.path.dirname(sys.executable) else: # 脚本模式下,获取当前脚本所在目录 full_path = os.path.realpath(__file__) file_path = os.path.dirname(full_path) aaa = get_html_file_path(file_path) print(aaa)
PyInstaller打包的核心注意事项
- 路径处理:绝对不要依赖
__file__获取程序运行目录,打包后它指向临时解压目录,必须用sys.executable(打包环境)和__file__(脚本环境)做分支判断。 - 外部资源:如果程序需要读取外部文件(如HTML、配置),要么把资源和EXE放在同一目录,要么用
--add-data参数将资源打包进EXE,运行时从临时目录读取。 - 权限问题:若程序需要写入文件或遍历系统目录,可能需要右键以管理员身份运行EXE。
- 控制台调试:调试阶段不要加
--windowed参数,否则会隐藏控制台,看不到print输出的错误信息;GUI程序上线时再添加该参数。 - 依赖库兼容:部分依赖动态链接库的模块,打包时需要用
--hidden-import指定缺失模块,或者查看打包日志定位报错点。
内容的提问来源于stack exchange,提问作者wasicat
相关产品推荐
相关产品推荐

