PyInstaller打包exe存文件遇PermissionError,VS Code运行正常求助
解决PyInstaller打包截图脚本后的权限错误
先看问题中的代码:
import os import time from PIL import ImageGrab IMAGES_DIR = 'Estudos3\images' FILENAME_FORMAT = 'screenshot_{}.png' def take_screenshot(): filename = FILENAME_FORMAT.format(int(time.time())) filepath = os.path.join(IMAGES_DIR, filename) ImageGrab.grab().save(filepath) take_screenshot()
问题描述
上述代码在VS Code中运行正常,能完成截图并保存到指定目录,但用PyInstaller打包成.exe后运行,出现权限错误:
PermissionError: [Errno 13] Permission denied: 'Estudos3\images\screenshot_1683919164.png'
解决办法
- 检查运行权限:右键exe文件,选择「以管理员身份运行」测试。如果能正常保存,说明是权限不足。可以设置exe永久以管理员身份运行:右键exe→属性→兼容性→勾选「以管理员身份运行此程序」。
- 改用绝对路径:相对路径
Estudos3\images的工作目录在打包后可能和预期不符,导致权限问题或找不到目录。修改代码使用绝对路径:
这样截图会保存在exe所在目录的BASE_DIR = os.path.dirname(os.path.abspath(__file__)) IMAGES_DIR = os.path.join(BASE_DIR, 'Estudos3', 'images')Estudos3\images下,避免工作目录不一致的问题。 - 确保目录存在:如果目标目录不存在,保存时也可能触发权限类错误。在截图函数里添加目录创建逻辑:
def take_screenshot(): os.makedirs(IMAGES_DIR, exist_ok=True) filename = FILENAME_FORMAT.format(int(time.time())) filepath = os.path.join(IMAGES_DIR, filename) ImageGrab.grab().save(filepath)exist_ok=True保证目录已存在时不会报错。 - 避开系统保护目录:不要把exe放在C盘的
Program Files、Windows等系统目录下,这些目录默认有严格的写入权限限制。将exe放在桌面、个人文档等用户有权限的目录运行。
内容的提问来源于stack exchange,提问作者Rodrigo Carvalho
相关产品推荐
相关产品推荐

