打包为exe的程序中调用了cmd窗口,调用的时候会自动弹窗,这个弹窗用pyinstaller的-w的方法是不行的,参考RT-ThreadStudio的方法是如下图写一个.bat文件,关闭弹窗回显
@echo off
cd /D %~dp0
pyocd.exe %*
但一个原因是 它是0.1.1版本太低了,另一个是它这个exe文件可能是二次封装了,比pyocd自带的要大好多,所以最后还是不用cmd了,用的是pyocd的api进行的擦写,因为前面读寄存器也用的api
主要是擦和写的代码,如下,碰见的坑是:使用powershell进行相同代码的调用的日志流可以正常显示,使用上位机ui的pyqt的文本框显示pyocd的下载日志流就崩了,原因是FileProgrammer的progress默认不指定相当于用的是sys.stdout,给它指定到print就行了,但这样的话牺牲了效果,只是简单的下载进度数字的显示,没有那种进度条了
class pyocd_exe():
# def list():
# os.system('pyocd' + ' ' + 'list')
def erase():
session = ConnectHelper.session_with_chosen_probe(target_override="gd32f425rg")
session.open()
eraser = FlashEraser(session, FlashEraser.Mode.CHIP)
eraser.erase([])
session.close()
print('erase sucess!!!\r\n')
def flash(file_path):
print("下载文件路径: " + file_path)
print('下载中,请等待······\r\n')
try:
session = ConnectHelper.session_with_chosen_probe(target_override="gd32f425rg")
with session:
programmer = FileProgrammer(session, # sys.stdout
progress=print,
chip_erase="sector",
trust_crc=False,
no_reset=False)
programmer.program(file_path)
session.close()
r_v = 0
except Exception as e:
traceback.print_exc()
return 1
if r_v == 0:
print('flash sucess!!!\r\n')
return 0
else:
print('flash fail!!!\r\n')
return 3