pyinstaller生成的exe文件的工作目录

发布时间 2023-10-30 00:57:24作者: pmh905001

困扰我两天的问题终于解决了,记录一下解决的过程。

背景:

在windows下到授渔.exe所在目录,双击授渔.exe,程序运行正常。

新功能需要开机启动,于是我使用了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 

 

重新启动机器,我们会发现一个命令行窗口弹出,1、2秒后有一串异常信息一闪而过。连续重试几次都无法看到到底是什么异常信息。 我当时使用的办法比较笨,采用了截屏的方式的方式最终抓取到了错误信息。

于是我往 授渔.exe所在目录添加了kb.ini文件,重启机器依然如上错误。按照我的理解,当前工作目录应该就是授渔.exe所在文件夹,难道开机启动和普通双击还有区别?于是打印一下kb.ini文件所在的绝对路径

os.path.abspath('kb.ini')

 

 

原来开机启动所在的工作目录根本就不是授渔.exe所在目录,而是c:\WINDOWS\system32. 果断将main入口设置工作目录:
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所在文件夹。
  • 给函数设置默认参数的时候,应传递常量,不要函数进行计算