pyinstaller生成的exe文件的所在的工作目录问题
困扰我两天的问题终于解决了,记录一下解决的过程。
背景:
在windows下到授渔.exe所在目录,双击授渔.exe (https://gitee.com/pmh905001/shouyu ),程序运行正常。新功能需要开机启动,于是我使用了python的自带模块winreg在SOFTWARE\Microsoft\Windows\CurrentVersion\Run这个key下成功创建了value: shouyu:D:\daily-tasks\github\shouyu\dist\授渔.exe . 但是开机启动功能不生效,查找日志没有日志文件生成。
分析:
第一步需要知道到底出了什么错误:我做了如下尝试:修改了如下的pyinstaller脚本,将-w参数去掉。 这样做的目的是看看控制台显示出来,有没有异常输出
pyinstaller -wF -p venv310/Scripts -p venv310/Lib/site-packages --add-data "./kb.ini;." --add-data "./resources/icons;./resources/icons" -i ./resources/icons/fish.png -n 授渔 main.py
于是我往 授渔.exe所在目录添加了kb.ini文件,重启机器依然如上错误。按照我的理解,当前工作目录应该就是授渔.exe所在文件夹,难道开机启动和普通双击还有区别?于是打印一下kb.ini文件所在的绝对路径
os.path.abspath('kb.ini')
os.chdir(os.path.dirname(sys.argv[0]))
重新启动机器,依然还是如上错误, 这下给整蒙了,到底又是哪儿出错了? 问题总会在想不到的地方出现。继续排查,main的入口根本都没有执行到。修改 https://gitee.com/pmh905001/shouyu/blob/main/shouyu/service/excel.py 如下:
错误原因是我excel_path参数的默认值会读取工作目录下kb.ini,这个时候根本没有执行到main函数的入口。我之前犯了一个错误,excel_path参数不能是一个函数的调用,否则它会先于main函数的执行。
修改代码,再次重启机器,问题得到修复。
总结:
- 开机启动的时候,程序的工作目录是c:\WINDOWS\system32,不是授渔.exe所在文件夹。
- 给函数设置默认参数的时候,应传递常量,不要函数进行计算
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)