手机网站模板 源码网络营销服务公司有哪些
esptool打包后失效解决方法
- 问题1
- 原因
- 解决方法
- 问题2
- 原因
- 解决方法
问题1
esptool经过pyinstaller打包成exe后,提示错误:Stub flasher JSON file for esp32 not found
原因
pyinstaller在进行esptool打包的时候,通常不用讲Stub flaser Json文件进行打包,所以在运行exe的时候会报错。
解决方法
解决方法就是在打包的时候,手动讲json文件添加进去。
① 首先,找到你的esptool安装路径:
import esptool
print(esptool.__file__)
② 在你的安装路径下,在esptool/文件夹下有一个tagets文件夹,stub flasher就在里面:
③ 在pyinstaller打包的时候,将stub flasher手动添加进去:
pyinstaller --add-data "path_to_site_packages/esptool/targets/stub_flasher;esptool/targets/stub_flasher" your_project.py
然后就可以正常使用esptool了
问题2
如果你打包的代码是GUI工程,比如你使用了pyQt或者pyside,而且在打包的时候使用了“-w” 或者“–windowed”指令去关闭控制台,这种情况下esptool仍然无法工作
原因
因为 -w 参数(也可写作 --windowed 或 --noconsole)会创建一个没有控制台窗口的 Windows 程序。这会影响到 esptool 的工作,因为esptool 依赖控制台进行输出和错误处理。
解决方法
一种方法是在程序启动时动态分配一个控制台。这样可以保持单个可执行文件,同时确保 esptool 能正常工作。这种方法的优点是可以保持单个可执行文件,只在需要时临时创建控制台,使用完后自动释放控制台,而且可以继续使用 -w 参数打包,这种方法应该能让 esptool 正常工作。下面程序是一个例子:
try:import ctypesimport syskernel32 = ctypes.WinDLL('kernel32', use_last_error=True)kernel32.AllocConsole()# 保存原始的标准输入输出old_stdout = sys.stdoutold_stderr = sys.stderr# 创建新的输出流stdout = open('CONOUT$', 'w')stderr = open('CONOUT$', 'w')sys.stdout = stdoutsys.stderr = stderrprint("开始固件更新,请勿断开设备...")import esptoolcommand = ['--chip', 'esp32','--port', port,'--baud', '921600','write_flash', '0x10000',self.ota_save_path + '/' + firmware_name]try:esptool.main(command)print("\n固件更新成功!")success = Trueexcept Exception as e:print(f"\n固件更新失败:{str(e)}")success = Falseraise efinally:# 恢复原始的标准输出sys.stdout = old_stdoutsys.stderr = old_stderr# 关闭输出流stdout.close()stderr.close()# 释放控制台kernel32.FreeConsole()