Python创建文本文件代码VSCode运行正常,PyInstaller打包后无法生成文件?
问题成因
__file__是Python脚本运行时的内置属性,仅在.py源码执行环境下生效,指向当前脚本的本地路径。PyInstaller打包生成的是二进制可执行文件,运行时不存在原始.py文件,__file__属性的取值会异常甚至直接未定义,导致写入路径无效,无法生成目标文件。- PyInstaller打包程序运行时会默认加载临时缓存目录,即使
__file__没有报错,最终生成的文件也可能被写入到临时目录,而非用户预期的可执行文件所在目录。
修复方案
兼容源码运行和打包后运行两种场景,调整路径获取逻辑即可,修改后的参考代码如下:
import os import sys # 判断当前运行环境 if getattr(sys, 'frozen', False): # 打包后运行:取可执行文件的所在目录 base_dir = os.path.dirname(sys.executable) # 自定义生成的文件名,此处取可执行文件名加.txt后缀,可按需修改 file_name = f"{os.path.basename(sys.executable)}.txt" else: # 源码运行:取当前脚本的所在目录 base_dir = os.path.dirname(os.path.abspath(__file__)) # 自定义生成的文件名,此处取脚本名加.txt后缀,可按需修改 file_name = f"{os.path.basename(__file__)}.txt" # 拼接完整的文件路径 target_file = os.path.join(base_dir, file_name) # 使用with上下文管理写入,自动释放文件句柄 with open(target_file, 'a', encoding='utf-8') as f: f.write('hello world')
额外注意
- 打包时若使用
--onefile参数,运行后文件会直接生成在可执行文件同级目录,符合预期。 - 若生成结果不符合预期,可以打印
target_file变量的值,确认路径是否匹配期望位置。
内容的提问来源于stack exchange,提问作者Mohammadreza
相关产品推荐
相关产品推荐

