如何解决Pyinstaller 应用程序:AccessDenied 在系统启动时运行的文件夹创建
def get_log_dir():
time_stmp = datetime.Now().strftime('%m%d-%H%M%s')
dir_ = Path('..') / f'log_{time_stmp}'
dir_.mkdir(exist_ok=True)
return dir_
if __name__ == '__main__':
path = get_log_dir()
我使用 pyinstaller --debug all -n minimal minimal.py
将其构建为 exe。
然后我用 NSIS 创建一个简单的安装程序:
Name "myAppName"
OutFile ".\myApp.exe"
SilentInstall silent
InstallDir "$LOCALAPPDATA\MyApp-0.1.1"
RequestExecutionLevel admin
Section "Main Section" SecMain
SetoutPath "$INSTDIR"
File /r ".\myApp-app\*"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Run" "myApp" '"$InstDir\minimal.exe"'
;Store installation folder
WriteRegStr HKCU "Software\myApp" "" $INSTDIR
Exec '"$INSTDIR\minimal.exe"'
SectionEnd
运行安装程序后,我将 exe 放入 AppData 文件夹,并且 HKLM 中有一个注册表项。它在安装结束时正确启动,我也可以随时手动启动它。 但是,如果我重新启动我的机器,脚本会按预期启动,但在尝试创建文件夹时失败并显示拒绝访问错误。什么可能导致这种情况和/或如何调试?是否有任何可以调查的 Windows 日志?也许 pyInstaller 日志?
更新:
有趣的是,如果不是修改注册表,而是创建一个快捷方式并将其放入 C:\Users\Username\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
,它会起作用。现在的问题是它有什么不同以及为什么不同?四处走动是一种干净的解决方案还是应该被视为一种黑客行为?
解决方法
运行条目和快捷方式的区别在于,快捷方式可以提供其他属性,例如设置当前目录。
这让我相信您的 Python 脚本中的 Path('..')
是问题所在,因为当前目录未指定为 Run 条目,并且在现实生活中可能是您没有写访问权限的 Windows 目录。
解决方案是将 ..
替换为 the full path of the .exe。试图找到当前脚本的路径是 surprisingly tricky。 appdirs package 还可以帮助您为日志文件找到合适的目录...
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。