STM32CubeProgrammer CLI通过Python subprocess调用失败原因咨询
Python调用subprocess执行STM32烧录命令失败的原因及解决办法
问题场景
手动在命令行执行以下命令可正常烧录STM32设备:
C:\location\bin>STM32_Programmer_CLI.exe -c port=COM1 -w C:\location\test.bin 0x08000000
但使用以下Python脚本调用subprocess.check_output时失败:
import os import subprocess #inputting commands when cli tool is running connection = "C:\location\\bin>STM32_Programmer_CLI.exe" subprocess.check_output([connection, '-c', '-c port=COM14' '-w C:\source\test.bin', '0x08000000'])
报错信息:
# Traceback (most recent call last): # File "C:\source\q.py", line 14, in <module> # subprocess.check_output([connection, '-c', '-c port=COM14' '-w C:\source\test.bin', '0x08000000']) # File "C:\source\python_version\py3110\Lib\subprocess.py", line 466, in check_output # return run(*popenargs, stdout=PIPE, timeout=timeout, check=True, # # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ # File "C:\source\python_version\py3110\Lib\subprocess.py", line 548, in run # with Popen(*popenargs, **kwargs) as process: # # ^^^^^^^^^^^^^^^^^^^^^^^^^^^ # File "C:\source\python_version\py3110\Lib\subprocess.py", line 1024, in __init__ # self._execute_child(args, executable, preexec_fn, close_fds, # File "C:\source\python_version\py3110\Lib\subprocess.py", line 1509, in _execute_child # hp, ht, pid, tid = _winapi.CreateProcess(executable, args, # # ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
失败原因分析
- 可执行文件路径错误:
connection变量里包含了命令行提示符>,这不是程序路径的一部分,系统根本找不到这个"带提示符的程序"。正确的路径应该是C:\location\bin\STM32_Programmer_CLI.exe。 - 参数拆分完全错误:subprocess的列表参数要求每个命令参数都是独立的列表元素。比如
-c port=COM14要拆成'-c'和'port=COM14'两个元素,-w C:\source\test.bin要拆成'-w'和'C:\source\test.bin'。原代码不仅没拆分,还把'-c port=COM14'和'-w...'连写(少了逗号),导致这俩字符串被拼接成一个无效参数,直接乱套。 - 路径转义问题:Windows路径里的反斜杠要么用
\\转义,要么用原始字符串(加r前缀),不然\l、\s这类字符会被Python解析成转义序列,导致路径实际指向错误的位置。
修正后的代码
import subprocess # 用原始字符串避免转义问题,去掉多余的命令行提示符> cli_executable = r"C:\location\bin\STM32_Programmer_CLI.exe" # 严格按照命令参数拆分,每个参数单独作为列表元素 output = subprocess.check_output([ cli_executable, '-c', 'port=COM14', '-w', r'C:\source\test.bin', '0x08000000' ]) # 可选:打印命令执行后的输出内容 print(output.decode('utf-8'))
内容的提问来源于stack exchange,提问作者mm-05
相关产品推荐
相关产品推荐

